Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 从另一个函数创建动态函数_Function_Fortran_Fortran90_Dynamic Function - Fatal编程技术网

Function 从另一个函数创建动态函数

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

我有一个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
    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。