如何将具有多个参数的函数传递给期望只有一个参数的函数的子例程?

时间:2015-07-03 13:57:38

标签: fortran gfortran

我有一个子程序(最小例子)

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,并使用ff(x)调用f(x,a),具体取决于present(a)在子程序的主体中。但改变子程序并不优雅。

1 个答案:

答案 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它是邪恶的,使用接口块。