Function 从另一个函数创建动态函数
我有一个Fortran 90子程序,它将函数作为参数,我想将该函数的修改版本传递给另一个子程序。我希望程序看起来像这样:Function 从另一个函数创建动态函数,function,fortran,fortran90,dynamic-function,Function,Fortran,Fortran90,Dynamic Function,我有一个Fortran 90子程序,它将函数作为参数,我想将该函数的修改版本传递给另一个子程序。我希望程序看起来像这样: subroutine foo(f, ...) real :: pt(2), dir(2) interface function f(x) result(y) real, intent(in) :: x(2) real :: y end function f
subroutine foo(f, ...)
real :: pt(2), dir(2)
interface
function f(x) result(y)
real, intent(in) :: x(2)
real :: y
end function f
end interface
pt = ...
dir = ...
!! Somehow create g(x) = f(pt + x*dir)
call bar(g)
end subroutine foo
subroutine bar(g)
interface
function g(x) result(y)
real, intent(in) :: x
real :: y
end function g
end interface
!! Do stuff with g
end subroutine bar
当‘g’只需要使用普通变量,而不是函数时,我已经设法做了类似的事情。在这种情况下,我使用全局变量将其作为一个全局函数,并在“foo”中分配给这些全局变量。但是,我找不到一种方法来将“f”变为全局函数,或将其分配给全局函数
有人知道怎么做吗?这个解决方案可以是任意复杂的。您可以使用过程指针,构建一个由其他函数组合而成的函数。请参阅以获取代码示例。这并不容易。在某些语言中,可以通过所谓的
闭包
向嵌套函数传递指针。这在Fortran(或C和类似语言)中是不可能的,因为数据会被更高一级函数的堆栈破坏。我建议您尝试函数对象,即带有函数指针的类
(或更多)和函数所需的数据。通过这种方式,您甚至可以进行函数合成和类似的函数操作
更多关于这个概念
下面是用于组合两个单参数函数的函数对象的示例:
module ComposeObj
use Parameters, only: rp
use AritmFunctions, only: fce
implicit none
private
public Compose
type Compose
private
procedure(fce),pointer,nopass :: f1 => null(),f2=>null()
contains
procedure,public :: call => helper
end type Compose
interface Compose
procedure NewCompose
end interface
contains
function NewCompose(f,g)
procedure(fce) :: f,g
type(Compose) :: NewCompose
NewCompose%f1 => f
NewCompose%f2 => g
end function NewCompose
pure real(rp) function helper(this,x)
class(Compose),intent(in) :: this
real(rp),intent(in) :: x
helper = this%f1(this%f2(x))
end function helper
end module ComposeObj
谢谢你的例子,但是它在Fortran 90中能工作吗?你使用的很多关键词对我来说都是新的;特别是,我只能在2003年而不是90年找到对“过程”的引用。不,过程指针是Fortran 2003的一个功能。Fortran 90已经完全过时了,人们应该使用的最早的标准是Fortran 95,它纠正了Fortran 95的几个问题,尽管它非常保守。现代Fortran编程需要Fortran 2003和2008。