在Fortran中将多个variables的外部函数作为一个variables的函数传递

我正在尝试使用QUADPACK例程来执行数值积分。 例程期望函数作为REAL,EXTERNAL传递,所以我没有使用指针或其他任何东西的自由。

是否有可能将函数f(x,a,b,...)作为f(x)的函数来用于仅期望函数x的函数? 就像使用@(x)f(x,a,b,...)MATLAB完成的一样。

您无法直接在Fortran中使用类似的function。 您也不能在Fortran中返回闭包。 只要写一个包装。

 function wrap_f(x) result(res) ... res = f(a,b,...) end function 

它可以是内部函数或模块函数,并通过主机关联获取ab ,也可以使用包含ab的模块。

如果要将该函数作为实际parameter passing,则不能是Fortran 2003中的内部过程,而只能在Fortran 2008中使用。但它适用于最新版本的gfortran和ifort。 为了更好的便携性使用一个模块。

我可以为这个问题展示一个很好的解决scheme。 我也是一个以前的MATLAB用户,当切换到FORTRAN你想念function处理哈哈。 我以这种方式解决了你的问题:

 module private public :: f , g real(kind=RP) :: a0,b0,c0,... contains function f(x,a,b,c,d,...) implicit none real(kind=RP) :: x,a,b,c,d,... real(kind=RP) :: f ! Here you define your function f = ... end function f function g(x) implicit none real(kind=RP) :: x , g ! Here you call "f" function with the frozen variables *0 g = f(x,a0,b0,c0,...) end function g ! We said that parameters were private ! (to avoid to be modified from the outside, which can be dangerous, ! so we define functions to set their values subroutine setValues(a,b,c,...) implicit none real(kind=RP) :: a,b,c,... a0 = a b0 = b c0 = c end subroutine setValues end module