如何在fortran中指向类方法?
我有一个模块,它定义了一个带有一些属性的类和一个方法(如何在fortran中指向类方法?,fortran,function-pointers,Fortran,Function Pointers,我有一个模块,它定义了一个带有一些属性的类和一个方法(proc1),它是一个函数。另一个模块定义了一个函数(proc2),该函数使用一个参数对函数进行求值,给定指向该函数和参数的指针。在主程序中,我想定义一个函数指针(fun),它指向class方法(proc1),这样计算fun(x)就相当于计算obj1%proc1(x)。可能吗 我的编译器gfortran 7.3抱怨说 应为(1)处的参数列表 使用下面的语法 module objmod implicit none ! object
proc1
),它是一个函数。另一个模块定义了一个函数(proc2
),该函数使用一个参数对函数进行求值,给定指向该函数和参数的指针。在主程序中,我想定义一个函数指针(fun
),它指向class方法(proc1
),这样计算fun(x)
就相当于计算obj1%proc1(x)
。可能吗
我的编译器gfortran 7.3抱怨说
应为(1)处的参数列表
使用下面的语法
module objmod
implicit none
! object with some data and a method
type obj
real :: a, b, c
contains
procedure, pass(self) :: proc1
end type obj
contains
! method which uses object and a variable
pure real function proc1(self, var)
class(obj), intent(in) :: self
real, intent(in) :: var
proc1 = var * (self % a + self % b + self % c)
end function proc1
end module objmod
module funmod
implicit none
contains
! function that evaluates fun(a), or does more complicated stuff
real function proc2(funptr, a)
procedure(real), pointer :: funptr
real, intent(in) :: a
proc2 = funptr(a)
end function proc2
end module funmod
program funPtr
use objmod
use funmod
implicit none
type(obj) :: obj1
real :: a, x
procedure(real), pointer :: fun
obj1 % a = 1.0
obj1 % b = 2.0
obj1 % c = 3.0
a = -1.5
fun => obj1 % proc1 ! function pointer to fun(x) = proc1(obj1, x)
x = proc2(fun, a)
print *, x
end program funPtr
不,你不能这样做。标准规定,对于指针分配的proc目标: C1030(R1040)程序名称应为内部, 模块,或伪过程,过程指针,特定的内在 表16.2中列出的功能,或 通过使用或主机关联访问,在范围单元中引用为 一个过程,或具有外部属性的过程 在您的示例中,
obj1%proc1
不是这些。如果给fun
一个显式接口,则可以将指针指定给proc1
(即实际的过程而不是类型组件)。当然,如果这样做,将丢失传递的对象方面
问题是函数指针没有类型绑定过程的上下文。对于“即实际过程而不是类型组件”,我想您是指绑定吗
proc1
不是一个组件。它在某种程度上是-它是一个类型绑定过程,被引用时就像它是一个组件一样。但是,我的观点是正确的。