我有一个子程序(最小例子)
subroutine treatfunction(f,input,output)
external, real::f
real, intent(in):: input
real, intent(out):: output
output = f(input) + f(1.0) ! i.e. f has only one argument
end subroutine
和一个带有两个参数的函数
real function fun(x,a)
real,intent(in)::x,a
现在,对于在运行时修复的给定a
,我想将fun
传递给treatfunction
。理想情况下,我想打电话给
call treatfunction(fun(:,a=a0), input=myinput, output=myoutput)
使用Fortran2003功能gfortran-5
支持的最优雅方式是什么?
当然,我可以在a
中插入可选的伪参数treatfunction
,并使用f
或f(x)
调用f(x,a)
,具体取决于present(a)
在子程序的主体中。但改变子程序并不优雅。
答案 0 :(得分:4)
在Fortran 2008中,您可以将内部函数作为参数传递,gfortran支持它。
subroutine calling()
a0 = ...
call treatfunction(wrapper, input=myinput, output=myoutput)
contains
real function wrapper(x)
real, intent(in) :: x
wrapper = fun(x,a0)
end function
end subroutine
顺便说一下,我会远离external
它是邪恶的,使用接口块。