Fortran 2003

时间:2015-06-18 08:58:31

标签: fortran fortran2003 fortran2008

亲爱的Fortran程序员,

是否有人知道,是否可以在Fortran 2003或更高版本中声明一个常量(参数)过程指针数组?

如下所示,我有一个切换器功能,它根据传入的整数参数调用不同的函数。它使用一组过程指针(包含在派生中)类型。在使用之前,必须在运行时期间通过init()例程初始化此数组。有没有办法,在编译期间初始化这个数组并避免这种初始化例程的必要性?它也可以定义为parameter,因为它的值在运行期间不会改变。

module testmod
  implicit none

  interface
    function funcInterface() result(res)
      integer :: res
    end function funcInterface
  end interface

  type :: ptrWrap
    procedure(funcInterface), nopass, pointer :: ptr
  end type ptrWrap

  type(ptrWrap) :: switcher(2)

contains

  subroutine init()
    switcher(1)%ptr => func1
    switcher(2)%ptr => func2
  end subroutine init

  function callFunc(ii) result(res)
    integer, intent(in) :: ii
    integer :: res
    res = switcher(ii)%ptr()
  end function callFunc

  function func1() result(res)
    integer :: res
    res = 1
  end function func1

  function func2() result(res)
    integer :: res
    res = 2
  end function func2

end module testmod


program test
  use testmod
  implicit none

  call init()  ! I'd like to get rid of this call.
  print *, callFunc(1)
  print *, callFunc(2)

end program test

2 个答案:

答案 0 :(得分:2)

我不认为这是允许的。从我对2008标准parameter的读取是data object的属性,数据对象的类不包括过程或过程指针。

当您为代码提供代码时,您的编译器会告诉您什么?

答案 1 :(得分:2)

Fortran 2008允许将过程指针和过程指针组件初始化到过程目标(而不是NULL())。语法与其他初始化器一致。

! In the scope of the module.
...
type(ptrWrap), parameter :: switcher(2) = [ptrWrap(func1), ptrWrap(func2)]
...