Fortran 如何将具有多个参数的函数传递给只需要一个参数的函数的子例程?
我有一个子程序(最少的例子) 和一个有两个参数的函数Fortran 如何将具有多个参数的函数传递给只需要一个参数的函数的子例程?,fortran,gfortran,Fortran,Gfortran,我有一个子程序(最少的例子) 和一个有两个参数的函数 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支持的最优雅的方式是什么 当然,我可以在treatfunctio
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
支持的最优雅的方式是什么
当然,我可以在
treatfunction
中插入可选的伪参数a
,并使用f(x)
或f(x,a)
调用f(x,a)
,具体取决于子例程主体中的present(a)
。但是更改子例程并不优雅。在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
它是邪恶的,使用接口块。你可以用一个带有一个参数的包装函数来实现这一点,然后这个参数会进一步调用。例如在。是的,我还记得塔尔在过去是类似的东西,但很难找到它。
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