正如 IanH 在他的评论中所说,调用 A(c(x)) 看起来像评估 c(x) 并将其传递给子例程 A。
如果您想将一个函数“C”传递给子例程 A,该函数接受一个类型为 X 的参数,有几种方法可以做到这一点。
如前所述,过程指针是一种新方法。虽然支持所有 Fortran 2003 标准的编译器极少,但这部分却得到了广泛的支持。
这是一个改编自Fortran 中的函数指针数组的示例
module ProcsMod
implicit none
contains
function f1 (x)
real :: f1
real, intent (in) :: x
f1 = 2.0 * x
return
end function f1
function f2 (x)
real :: f2
real, intent (in) :: x
f2 = 3.0 * x**2
return
end function f2
subroutine fancy (func, x, answer)
real, intent (in) :: x
real, intent (out) :: answer
interface AFunc
function func (y)
real :: func
real, intent (in) ::y
end function func
end interface AFunc
answer = func (x)
end subroutine fancy
end module ProcsMod
program test_proc_ptr
use ProcsMod
implicit none
interface
function func (z)
real :: func
real, intent (in) :: z
end function func
end interface
procedure (func), pointer :: f_ptr => null ()
real :: answer
f_ptr => f1
call fancy (f_ptr, 2.0, answer)
write (*, *) answer
f_ptr => f2
call fancy (f_ptr, 2.0, answer)
write (*, *) answer
stop
end program test_proc_ptr
调用“call fancy (f_ptr, 2.0, answer)”看起来是一样的,但是通过改变函数指针 f_ptr 指向的函数,一个不同的函数被传递给子程序 fancy。
这与 gfortran(版本 4.4 到 4.7)和 ifort 一起编译。