如何以Fortran派生类型存储对过程的引用

时间:2018-06-20 12:07:57

标签: fortran

我可以在Fortran类型中存储对过程的引用吗?

我的目标是通过将重复的参数分组为一个类型,将其减少到Fortran子例程中。但是Fortran不允许我对外部过程执行此操作。

这是我尝试做的一个简化示例:

module my_functions
    type mytype
        external :: f
    end type
contains
    subroutine fa()
        WRITE(*,*) "yiha"
    end subroutine

    subroutine fb(t)
        type(mytype) t
        call t%f()
    end subroutine
end module

program test
    use my_functions
    type(mytype) :: m
    m%f = fa
    call fb(m)
end program

但是gfortran给了我

     external :: f
                 1
Error: Unexpected attribute declaration statement at (1)

1 个答案:

答案 0 :(得分:4)

派生类型可能具有过程指针作为组件:

implicit none

type mytype
  procedure(), pointer, nopass :: f
end type

type(mytype) m

external fa
m%f => fa

call m%f()

end

此类型具有一个带有隐式接口的过程,该过程稍后将作为子例程引用。因为它具有隐式接口,所以指针需要nopass属性。