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
如何在fortran中指向类方法?_Fortran_Function Pointers - Fatal编程技术网

如何在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
不是一个组件。它在某种程度上是-它是一个类型绑定过程,被引用时就像它是一个组件一样。但是,我的观点是正确的。