将过程指针传递给derived-type-bound-procedure

时间:2017-04-06 14:19:27

标签: fortran fortran2003

我正在尝试将过程指针传递给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)。在所有其他情况下,伪参数会自动传递,为什么不在这里?声明伪参数是不可行的,因为过程使用的对象发生了变化。 我的问题有什么解决方案吗?

1 个答案:

答案 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但是如果你需要在某些情况下将其设置为其他目标。