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