Fortran 是否可以使用USE语句加载内置函数?

Fortran 是否可以使用USE语句加载内置函数?,fortran,Fortran,我目前正在玩弄将函数作为参数传递 在下面的程序中,我使用内置函数EXP作为 积分函数。我的编译器给了我以下错误: integrate1.f90:22.26: r = integral(-1.0,1.0,EXP,1000); 1 Error: Expected a procedure for argument 'f' at (1) 如果我在变量r的声明中取消注释EXP的用法,我不会得到这个错误 因此,如果我不使用内置函数,我就不能将其用作参数 这有点

我目前正在玩弄将函数作为参数传递

在下面的程序中,我使用内置函数
EXP
作为 积分函数。我的编译器给了我以下错误:

integrate1.f90:22.26:

r = integral(-1.0,1.0,EXP,1000);
                      1
Error: Expected a procedure for argument 'f' at (1)
如果我在变量
r
的声明中取消注释
EXP
的用法,我不会得到这个错误

因此,如果我不使用内置函数,我就不能将其用作参数 这有点奇怪,因为“内置”暗示不管发生什么,函数都会被加载

如果不显式使用
EXP
函数,如何防止此错误?我是否需要使用
use
语句来加载内置的?如果没有其他办法,我想知道这是因为Fortran规范还是编译器问题

我正在使用GNU Fortran(Ubuntu/Linaro 4.7.3-1ubuntu1)4.7.3

例如:

MODULE MINTEGRATE
CONTAINS
FUNCTION integral(from,to,f,n)
    INTERFACE
        FUNCTION f(y); REAL, INTENT(IN) :: y; END FUNCTION
    END INTERFACE
    REAL :: from,to,integral,width;
    INTEGER :: n;

    width=ABS(to-from)/n;
    integral = 0.0;
    DO i=0,n
        integral = integral+f(from+width*i)*width;
    END DO
END
END

PROGRAM INTEGRATE
USE MINTEGRATE;

!PROCEDURE(EXP), POINTER :: f => EXP; ! using the variable f below works without error
REAL :: r!=EXP(0.0);
r = integral(-1.0,1.0,EXP,1000);
WRITE(*,*) r;
END
“当内部函数作为实际参数传递给过程时,必须使用其特定名称,调用时,其参数必须是标量。并非所有特定的内部函数都可以显示为实际参数。(有关详细信息,请参阅)。”摘自《英特尔Fortran手册》

您很幸运,因为单精度实数的泛型
exp
的特定名称也是
exp
,但是要小心,传递正确的特定函数,或者编写自己的包装器来调用泛型名称。例如,如果需要默认的实对数,则必须使用
alog

您可以通过以下方式告知编译器您指的是内部函数exp:

intrinsic exp

放置在主程序中的声明中。

我从未这样做过,但我相信您必须使用过程指针。其他人可能会有更好的主意。虽然有点黑客,但您可以定义自己的函数
myexp
,该函数调用
EXP
.thx iro bot。过程指针方法工作正常——我在代码中添加了一条注释,但在结束之前,我将等待最终的其他建议