在Fortran 90中打印函数名

4
我写了一段代码,它可以找到提供的参数中名为"func"的函数的根,我想我是从Numerical Recipes中得到的。大概长这样:
double precision function rtsafe(x_init, x1, x2, xacc, func, dfunc)
其中func和dfunc是两个函数的名称。当然我会用不同的函数func和dfunc调用rtsafe函数。 当我在 rtsafe 中时,我想打印所调用的函数func和dfunc的名称,因为当rtsafe出现错误时,我想知道我正在使用哪个函数。类似于:
write(,)"my func = ", func
(?)
有人知道怎么做吗?
2个回答

1
您可以在函数中添加一个可选参数,以返回函数的名称:
    FUNCTION f(x, fname) RESULT (fx)
      IMPLICIT NONE
      REAL                        :: x, fx
      CHARACTER(LEN=*), OPTIONAL  :: fname
      CHARACTER(LEN=*), PARAMETER :: myfname='somename'

      IF (present(fname)) fname=myfname

      fx = x   ! or whatever else

    END FUNCTION f

在rtsafe中第一次调用您的函数时,您会获得函数名称,以便在出现错误时进行打印。
虽然我没有测试过,但应该大致上可以像这样工作,也是我能想到在Fortran中执行此操作的唯一方法。

0
也许你可以想出一些手动的解决方案(传递函数名称,然后打印带有“OK”的函数名称...或者类似的东西),但是打印函数/子程序的名称(reflecting)是不可能的。

无法打印函数指针吗?我知道Fortran中没有指针,但有类似的东西吗?在这种情况下,我可以编写一个指向表格-->'函数名称'的指针。给定一个指针,我可以从表格中读取名称。 - simona
@simona - Fortran 也有指针,但它们与 C 中的不同。话虽如此,我真的无法说...我从未有过这样做的需要,所以会胡言乱语。保留问题,这里有一些更有知识的人可能会找到解决方案。但是,如果只是为了你所说的目的,你不能只在函数完成后打印出控制语句或者其他简单的东西吗? - Rook
我想要在调用函数rtsaf失败时才打印输出。因为错误不是关键的,而且执行会继续,如果在函数完成时打印控制语句,我会被func的输出淹没... - simona
OK. 这个 rtsafe 是一个根查找函数。我正在使用 rtsafe 查找函数 func1 的根,但是 func1 内部调用了另一个应用于函数 func2 的 rtsafe 实例。 - simona
rtsafe -> func1 -> rtsafe -> func2。当func未被括起来时,失败就会发生,然后rtsafe会报错并返回0。如果这种情况发生在func2中,那应该是可以的,因为当func1内部返回0时,会导致func1输出的值(比如y)不正确,然后传递给rtsafe。这个想法是,当func1在rtsafe内部返回y时,y的值不等于0,而rtsafe会将其丢弃。 - simona
这里的重点是有另一个函数func3,它由rtsafe->func1->rtsafe->func2定义,并且依赖于两个参数。现在对于某些参数值,func1和func2未被很好地定义,它们返回nan或垃圾,因此我必须远离这些值。但是,如果我限制参数的范围,那么这些函数就不可逆(没有括号),我需要以某种平滑的方式处理这种情况。也许这不是最好的方法,但我仍在思考如何解决它。同时,我想了解当我认为func2中的括号失败时,我是否正确。 - simona

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接