5

親愛なる 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
4

2 に答える 2

2

Fortran 2008 では、プロシージャ ポインタおよびプロシージャ ポインタ コンポーネントをプロシージャ ターゲットに初期化できます (対NULL())。構文は、他の初期化子と一致しています。

! In the scope of the module.
...
type(ptrWrap), parameter :: switcher(2) = [ptrWrap(func1), ptrWrap(func2)]
...
于 2015-06-20T10:23:18.853 に答える