4

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

在下面的程序中,我使用内置函数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
4

1 回答 1

6

“当内在函数作为实际参数传递给过程时,必须使用其特定名称,并且在调用时,其参数必须是标量。并非所有特定的内在函数都可以作为实际参数出现。(有关更多信息,请参阅Intrinsic不允许作为实际参数的函数)。” 来自英特尔 Fortran 手册。

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

您可以通过以下方式通知编译器您的意思是内在函数 exp:

intrinsic exp

放在主程序的声明中。

于 2013-10-25T16:58:26.270 回答