4

一部の Fortran 95 コードでは、ポインター フィールドを持つ型があります。type(foo)コンパイル時に初期化されるモジュール変数を宣言したい。このようなもの:

module foo_module
  implicit none
  type foo_type
     integer :: x
     logical, pointer :: x_flag => null()
  end type foo_type

  logical, target :: bar_flag
  ! this does not compile of course:
  type(foo_type) :: bar = foo_type(1, bar_flag)
end module foo_module

上記のスニペットはコンパイルされません。bar次のような別のサブルーチンを使用して、実行時に初期化できることを理解しています。

module foo_module
  implicit none
  type foo_type
     integer :: x
     logical, pointer :: x_flag => null()
  end type foo_type

  logical, target :: bar_flag
  type(foo_type) :: bar
contains
  subroutine init()
    bar%x = 1
    bar%x_flag => bar_flag
  end subroutine init
end module foo_module

しかし、初期化サブルーチンなしでこれを行うことは可能ですか? または、コンパイラによって明示的に呼び出される初期化サブルーチンを宣言することは可能ですか? 注: これは Fortran 95 で行う必要があります。

4

1 に答える 1

6

初期化子 (コード例の最初のブロックの bar の宣言で equals の後に現れるもの) は、初期化 (定数) 式でなければなりません。Fortran 95 の初期化式の規則では、構造体コンストラクターで NULL() 以外のポインター ターゲットを許可していません。

(この規則は Fortran 2008 で緩和され、初期化式の構造体コンストラクターのポインター ターゲットを save 属性を持つ変数にできるようになりました。)

init サブルーチンは、個々のコンポーネントへの代入の代わりに構造コンストラクターを使用できることに注意してください。モジュールを使用するクライアント コードは、構造体コンストラクターを使用して bar への割り当てを直接実行することもできますbar = foo_type(1, bar_flag)問題は、構造体コンストラクターでのポインター ターゲットの使用ではなく、初期化式でなければならない場所での構造体コンストラクターでのポインター ターゲットの出現です。

派生型の初期化手順を宣言することはできません。(Fortran 2003 では、構造コンストラクターをオーバーライドする関数を使用できますが、そのような関数を初期化式で使用することはできません。)

于 2012-08-10T18:18:46.780 に答える