我目前正在玩弄将函数作为参数传递。
在下面的程序中,我使用内置函数EXP
作为积分函数的参数。我的编译器给了我以下错误:
integrate1.f90:22.26:
r = integral(-1.0,1.0,EXP,1000);
1
Error: Expected a procedure for argument 'f' at (1)
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