我正在尝试将过程指针传递给derived-type-bound-procedure
module mymodule
use mystoremodule
implicit none
private
type, abstract, public :: mytype
contains
procedure :: parse
end type mytype
contains
subroutine parse(self,mypointer)
implicit none
! Declaring Part
class(mytype) :: self
procedure(storing),pointer, intent(in) :: mypointer
integer :: myvalue
! Executing Part
myvalue = 42
call mypointer(myvalue)
end subroutine parse
end module mymodule
其中storing
在另一个模块/派生类型中定义
module mystoremodule
implicit none
type, public :: storingtype
integer :: myvalue
contains
procedure, public :: storing
end type storingtype
contains
subroutine storing(self,myvalue)
! Declaring part
class(storingtype) :: self
integer, intent(in) :: myvalue
! Executing part
self%myvalue = myvalue
end subroutine SetExcitationOrder
end module mystoremodule
我通过
调用该程序call mytypeobject%parse(storingtypeobject%storing)
我得到编译器错误
The type of the actual argument differs from the type of the dummy argument.
我发现错误来自过程指针没有将伪参数传递给storing
过程(我没有将任何内容定义为nopass
)。在所有其他情况下,伪参数会自动传递,为什么不在这里?声明伪参数是不可行的,因为过程使用的对象发生了变化。
我的问题有什么解决方案吗?
答案 0 :(得分:0)
嗯,你没有传递过程指针。 storingtypeobject%storing
不是过程指针,它是对类型绑定过程的绑定,而不是任何类型的指针。
我实际上不接受指针,只是parse
中的过程参数。
类似的东西:
subroutine parse(self,mypointer)
implicit none
! Declaring Part
class(mytype) :: self
procedure(storing), intent(in) :: myproc
integer :: myvalue
! Executing Part
myvalue = 42
call myproc(myvalue)
end subroutine parse
和
call mytypeobject%parse(storing_wrapper)
contains
subroutine storring_wrapper(myvalue)
integer, intent(in) :: myvalue
call storingtypeobject%storing(myvalue)
end subroutine
我认为只有在可以在某处更改过程指针时,它才最有用。不一定在parse
但是如果你需要在某些情况下将其设置为其他目标。