【发布时间】:2015-07-27 04:04:52
【问题描述】:
如何指向类型绑定过程?假设我有一些外部子例程,它接受一个指向只接受一个参数的函数的指针作为参数。
call integrator(f0)
如果函数 f0 被定义在某个地方使其看起来像这样,这将起作用
function f0(x) result(val)
... do something...
end function
但是现在我有一个带有一些类型绑定过程的 SomeClass 类型。这些类型绑定过程之一是
function integrand(this,x) result(val)
class(SomeClass), intent(in) :: this
...do something...
end function
我有另一个相同类型的类型绑定过程,它想要调用上面的子例程,将第一个类型绑定过程传递给它,但我不知道如何编写它!让我先尝试一下有点幼稚的,
function CalculateIntegral(this) result(val)
class(SomeClass), intent(in) :: this
call integrator(this%integrand)
end function
这给了我
call integrator(this%integrand)
1
Error: Expected argument list at (1)
我从this discussion 学到的是因为 this%integrand 不返回指向函数的指针,而是对函数的绑定。
所以,我现在试试这个
function CalculateIntegral(this) result(val)
class(SomeClass), intent(in) :: this
call integrator(integrand)
end function
它编译但给了我一个内存引用错误,因为它试图将值 (x) 传递给类 (SomeClass) 类型的参数(即 this)。
所以如果 this%integrand 只给我一个绑定而不是一个指向类型绑定成员过程的指针,我如何在没有第一个“this”参数进入的情况下将我的一个类型绑定成员过程传递给外部子例程怎么走?
注意:我习惯用 python 编码,其中 self.integrand 可以传递给外部函数,一切都会好起来的。
编辑:我的错;我记错了。如果您尝试将 self.integrand 传递给外部函数,Python 也会遇到同样的问题。
【问题讨论】:
-
几乎是stackoverflow.com/questions/31208594/… 的副本,该解决方案也应适用于此处。您应该说明 Python 方法的确切含义,即使在 Python 中也有更多的回调方法。另见fortran90.org/src/best-practices.html#callbacks
-
@VladimirF 这个帖子会因为重复而关闭吗?如果尚未确定,我将在下面更新我的代码以征求意见或更好的方法。如果重复的可能性很高,我将删除下面的代码。)
-
应该不会吧,不知道其他人怎么看,不过暂时不会关闭。也许如果在其他地方有一个真正完全相同的副本,但我的回答只是说明了更多的可能性之一。
标签: fortran