我目前正在将传递函数作为参数.
在下面的程序中,我使用内置函数EXP作为积分函数的参数.我的编译器给了我以下错误:
integrate1.f90:22.26:
r = integral(-1.0,1.0,EXP,1000);
1
Error: Expected a procedure for argument 'f' at (1)
Run Code Online (Sandbox Code Playgroud)
如果我取消注释EXP变量声明的用法r我不会得到这个错误.
因此,如果我不使用内置函数,我似乎不能将它用作一种奇怪的参数,因为"内置"类型暗示函数无论如何都被加载.
如何在不明确使用该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
Run Code Online (Sandbox Code Playgroud)
"当一个内部函数作为一个实际参数传递给一个过程时,必须使用它的特定名称,并且在被调用时,它的参数必须是标量.并非所有特定的内部函数都可以作为实际参数出现.(更多信息,请参阅内在函数函数不允许作为实际参数.)" 来自英特尔Fortran手册.
你很幸运,因为exp单精度real 的泛型的特定名称也是exp,但是要小心并传递正确的特定函数,或者写自己的包装器调用通用名称.例如,如果您想要默认的实对数,则必须使用alog.
你可以告诉编译器你的意思是intrisic函数exp:
intrinsic exp
Run Code Online (Sandbox Code Playgroud)
放在主程序的声明中.