gpt4 book ai didi

function - 从另一个函数创建动态函数

转载 作者:行者123 更新时间:2023-12-04 18:12:53 25 4
gpt4 key购买 nike

我有一个 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”设为全局或将其分配给全局函数的方法。

任何人有任何想法如何做到这一点?解决方案可以随心所欲。

最佳答案

这不是那么容易。在某些语言中,您可以在所谓的 closure 中传递指向嵌套函数的指针。 .这在 Fortran(或 C 和类似语言)中是不可能的,因为数据会被更高层函数的堆栈破坏。我建议您尝试函数对象,即 classfunction pointer (或更多)和函数所需的数据。通过这种方式,您甚至可以进行函数组合和类似的函数操作。
更多关于概念 http://en.wikipedia.org/wiki/Function_object
以下是用于组合两个单参数函数的函数对象示例:

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

关于function - 从另一个函数创建动态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9692697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com