2 回答
TA贡献1839条经验 获得超15个赞
您不能直接使用Fortran中的函数来做类似的技巧。您也无法在Fortran中返回闭包。只是写一个包装。
function wrap_f(x) result(res)
...
res = f(a,b,...)
end function
它可以是内部函数或模块函数,并可以通过主机关联获取a和b,也可以使用包含a和的模块b。
如果要将函数作为实际参数传递,则在Fortran 2003之前的版本中,它不能是内部过程,而只能在Fortran 2008中。它只能在gfortran和ifort的最新版本中使用。为了更好的可移植性,请使用模块。
TA贡献1876条经验 获得超5个赞
我可以为这个问题显示一个很好的解决方案。我也是MATLAB的前用户,切换到FORTRAN时会错过函数句柄哈哈。我以这种方式解决了您的问题:
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
- 2 回答
- 0 关注
- 756 浏览
添加回答
举报