変数の定義状況

変数は定義済み、または未定義のどちらかで、その定義状況をプログラムの実行中に変更することができます。 名前付き定数は、値を持っています。 名前付き定数をプログラムの実行時に定義または再定義することはできません。

文字型または複素数型の配列 (セクションを含む)、 構造体、および変数は、0 以上のサブオブジェクトからなるオブジェクトです。 変数とサブオブジェクト間、および異なる変数のサブオブジェクト間に 関連付けを確立することができます。

DATA ステートメント、型 宣言ステートメント、STATIC ステートメントで 初期値を持つように指定された変数は、最初は定義済みです。 さらに、デフォルトの初期化によって、変数の初期値定義される場合があります。 ゼロ・サイズの配列およびゼロ長の文字オブジェクトは、常に定義されます。

それ以外の変数はすべて、最初は未定義です。

定義を発生させるイベント

以下に示すイベントは、変数を定義済みにします。

  1. マスクされた配列割り当てステートメント以外の組み込み割り当てステートメント

    FORTRAN 95 の開始 または FORALL 割り当てステートメント FORTRAN 95 の終了 を 実行すると、等号の前の変数は定義済みになります。

    定義済みの割り当てステートメントを実行すると、 等号の前の全部または一部の変数が定義済みになる場合があります。

  2. マスクされた配列割り当てステートメント FORTRAN 95 の開始、 または FORALL 割り当てステートメント FORTRAN 95 の終了 を 実行すると、割り当てステートメントの配列エレメントの一部またはすべてが定義済みになる場合があります。
  3. 1 つの入力ステートメントを実行すると、入力ファイルから値を 割り当てられた変数はそれぞれ、データを受け取った時点で定義済みになります。 単位指定子で内部ファイルを識別する WRITE ステートメントを 実行すると、書き込まれる各レコードが定義済みになります。

    非同期入力ステートメントを実行すると、 対応する WAIT ステートメントが実行されるまで 変数は定義済みになりません。

  4. DO ステートメントを実行すると、 DO 変数 (もしあれば) は定義済みになります。

    +---------------------------------Fortran 95---------------------------------+

  5. さらに、デフォルトの初期化によって、 変数が最初から定義される場合があります。

    +-----------------------------End of Fortran 95------------------------------+

  6. 入出力ステートメント内の暗黙 DO リストで指定した 処理の実行を開始すると、暗黙 DO 変数は定義済みになります。
  7. ASSIGN ステートメントを実行すると、ステートメント内の 変数は、ステートメント・ラベルの値によって定義済みとなります。
  8. 仮引き数が INTENT(OUT) を持っておらず、 それに対応する実引き数全体がステートメント・ラベル以外の値で定義されている場合、 プロシージャーに対する参照によって、仮引き数のデータ・オブジェクト全体が定義されます。

    仮引き数に対応する実引き数の対応サブオブジェクトが定義済みの場合、プロシージャーに対する参照に よって、INTENT(OUT) を持たない仮引き数のサブオブジェクトは定義済みになります。

  9. IOSTAT= 指定子が入っている入出力ステートメントを実行すると、 指定された整変数は定義済みになります。

    +-------------------------Fortran 2003 ドラフト標準--------------------------+

  10. IOMSG= 指定子が入っている入出力ステートメントを実行すると、エラー、ファイルの終わり、レコードの終わりの発生時に、指定された文字変数は定義済みになります。

    +----------------------End of Fortran 2003 ドラフト標準----------------------+

  11. SIZE= 指定子が入っている READ ステートメントを 実行すると、指定された整変数は定義済みになります。

    +----------------------------------IBM 拡張----------------------------------+

  12. ID= 指定子が入っている、XL Fortran の READ または WRITE ステートメントを実行すると、指定された整数変数は定義済みになります。
  13. DONE= 指定子が入っている XL Fortran の WAIT ステートメントを 実行すると、指定された論理変数は定義済みになります。
  14. NUM= 指定子が入っている、XL Fortran の同期 READ または WRITE ステートメントを実行すると、指定された整数変数は 定義済みになります。

    NUM= 指定子が入っている非同期 READ また は WRITE ステートメントを実行すると、指定された整変数は 定義済みになります。 整変数は、対応する WAIT ステートメントの実行時に定義されます。

    +------------------------------End of IBM 拡張-------------------------------+

  15. INQUIRE ステートメントを実行すると、 エラー条件が存在しない場合に、そのステートメントの実行値に値を 割り当てられている変数はすべて定義済みになります。
  16. 1 つの文字記憶単位が定義済みであれば、 それに関連するすべての文字記憶単位が定義済みとなります。

    数値記憶単位が定義済みであれば、同じ型で、関連した 数値記憶単位はすべて定義済みとなります。ただし、ASSIGN ステートメントが 実行される場合には、ASSIGN ステートメント内の 変数に関連した変数は、未定義となります。 型のエンティティー DOUBLE PRECISION が定義済みになると、 その全体が関連した倍精度実数型のエンティティーはすべて 定義済みとなります。

    デフォルト以外の整数型、デフォルトまたは倍精度以外の 実数型、デフォルト以外の論理型、デフォルト以外の複素数型、 任意の長さを持つデフォルト以外の文字型、または非順序型のポインターなしの スカラー・オブジェクトは、各ケースごとに異なる未指定の単一記憶単位を占有します。 他のポインターと、型、種類、ランクの少なくとも 1 つが 明らかに異なるポインターは、未指定の単一記憶単位を占有します。 未指定の記憶単位が定義済みとなると、関連するすべての未指定記憶単位は、 定義済みとなります。

  17. デフォルトの複素数エンティティーが定義されると、その一部が 関連したデフォルトの実数エンティティーは、すべて定義済みとなります。
  18. 一部が関連するデフォルトの実数型エンティティー または複素数型エンティティーが定義済みとなることにより、 デフォルトの複素数エンティティーの両方の部分が定義済みとなり、 そのデフォルトの複素数型エンティティーが定義済みとなります。
  19. 部分的に関連したオブジェクトが定義済みとなることにより、 数値順序構造体または文字順序構造体のすべてのコンポーネントが定義済みとなり、 その構造体は定義済みとなります。
  20. STAT= 指定子付きの ALLOCATE ステートメント または DEALLOCATE ステートメントを実行すると、 STAT= 指定子で指定された変数は、定義済みとなります。
  21. ゼロ・サイズの配列を割り当てると、その配列は定義済みとなります。
  22. プロシージャーを呼び出すと、そのプロシージャー内のゼロ・サイズの 自動オブジェクトは、すべて定義済みとなります。
  23. 定義済みのターゲットに、ポインターを関連させる ポインター割り当てステートメントを実行すると、 そのポインターは定義済みとなります。
  24. 非ポインターの割り振り不可自動オブジェクトを含む プロシージャーを呼び出すと、そのオブジェクトの非ポインター・デフォルト初期化済み サブコンポーネントはすべて定義済みになります。
  25. 非ポインターの割り振り不可 INTENT(OUT) 仮引き数を 含むプロシージャーを呼び出すと、そのオブジェクトの 非ポインター・デフォルト初期化済みサブコンポーネントはすべて定義済みになります。
  26. 非ポインター・コンポーネントがデフォルトの初期化によって初期化される 派生型のオブジェクトを割り振ると、コンポーネントとそのサブオブジェクトは 定義済みになります。

    +---------------------------------Fortran 95---------------------------------+

  27. Fortran 95 で使用される FORALL ステートメント または構文では、index-name 値セットが評価されると、 index-name は定義済みになります。

    +-----------------------------End of Fortran 95------------------------------+

    +----------------------------------IBM 拡張----------------------------------+

  28. COPYIN 文節にない THREADPRIVATE 非ポインター 割り振り不可変数が最初の並列領域に入るときに定義される場合、 変数のそれぞれの新しいスレッドのコピーが定義されます。
  29. COPYIN 文節にない THREADPRIVATE 共通ブロックが 最初の並列領域に入るときに定義される場合、 変数のそれぞれの新しいスレッドのコピーが定義されます。
  30. COPYIN 文節に指定された THREADPRIVATE 変数の場合、 それぞれの新しいスレッドが、マスター・スレッドの定義、割り振り、 およびこの変数の関連付け状況を複写します。 したがって、並列領域に入る時に変数のマスター・スレッドのコピーが 定義される場合は、変数のそれぞれの新しいスレッドのコピーも定義されます。
  31. COPYIN 文節内にある THREADPRIVATE 共通ブロックの場合、 それぞれの新しいスレッドはマスター・スレッドの定義、割り振り、および 共通ブロック内の変数の関連付け状況を複写します。 したがって、並列領域に入るときに共通ブロック変数のマスター・スレッドの コピーが定義される場合、共通ブロック変数のそれぞれの新しいスレッドの コピーも定義されます。
  32. 変数が PARALLELPARALLEL DODOPARALLEL SECTIONSPARALLEL WORKSHARESECTIONS、または SINGLE ディレクティブの FIRSTPRIVATE 文節で指定されると、それぞれの新しいスレッドがマスター・スレッドの定義と その変数の関連付け状況を複写します。 したがって、並列領域に入る時に変数のマスター・スレッドのコピーが 定義される場合は、変数のそれぞれの新しいスレッドのコピーも定義されます。
  33. 各変数、 または共通ブロック内の変数が COPYPRIVATE 文節で指定されている場合、 SINGLE 構成に囲まれたコードの実行後で、チーム内のスレッドが 構成から離れる前に変数のすべてのコピーが以下のように定義されます。

    +------------------------------End of IBM 拡張-------------------------------+

未定義を発生させるイベント

以下に示すイベントは、変数を未定義にします。

  1. 指定した型の変数が定義済みとなると、関連した 別の型の変数はすべて未定義になります。 しかし、デフォルトの実数型の変数がデフォルトの 複素数型の変数に部分的に関連する場合、実数型の 変数が定義済みになっていると、複素数型の変数は未定義になりません。 また、複素数型の変数が定義済みになっていると、実数型の変数は 未定義にはなりません。 デフォルトの複素数型の変数が別のデフォルトの複素数型の 変数と部分的に関連していると、一方を定義しても他方が未定義になる ことはありません。
  2. ASSIGN ステートメントを実行すると、 そのステートメント内の変数は、整数として未定義になります。 その変数に関連した変数も未定義になります。
  3. 関数の評価によって、関数の引き数、またはモジュールや共通ブロック内の 変数が定義済みとなる場合、しかも関数に対する参照が、関数の値によって式の値を 決める必要のない式に現れる場合、その引き数または変数は式の計算時に 未定義になります。
  4. サブプログラム内の RETURN ステートメント または END ステートメントの実行で、再帰的に呼び出す場合は、 その有効範囲単位に対してローカルである変数、またはその有効範囲単位の 現在のインスタンスに対してローカルである変数のすべてが未定義になります。 ただし、以下のものは除きます。
    1. SAVE または STATIC 属性を持つ変数
    2. 無名共通ブロック内の変数
    3. Fortran 90 に従い、名前付き共通ブロック内の変数で、 サブプログラムにあるもの、また、サブプログラムに対する直接参照 または間接参照を行う 1 つ以上の他の有効範囲単位内にあるもの 変数がスレッド・ローカル共通ブロックの一部でない限り、 IBM 拡張の開始 XL Fortran では、これらの変数は未定義にされません。 IBM 拡張の終了
    4. ホスト有効範囲単位からアクセスする変数
    5. Fortran 90 に従い、モジュールからアクセスされる変数で、 サブプログラムに対する直接参照または間接参照を行う 1 つ以上の 他の有効範囲単位によって、直接または間接的にも参照されるもの

      IBM 拡張の開始 XL Fortran は、これらの変数を未定義にはしません。

      IBM 拡張の終了

    6. Fortran 90 に従い、名前付き共通ブロック内の変数で、 最初に定義されていてそれ以降定義または再定義されていないもの

      IBM 拡張の開始 XL Fortran は、これらの変数を未定義にはしません。

      IBM 拡張の終了

  5. 入力ステートメントの実行時にエラー条件またはファイルの終わり条件が 発生すると、入力リスト、あるいはそのステートメントの 名前リスト・グループで指定した変数は、すべて未定義になります。
  6. 入出力ステートメントの実行時にエラー条件、ファイルの終わり条件、 またはレコードの終わり条件が発生し、 そのステートメントに暗黙 DO リストが 含まれていた場合は、そのステートメント内の暗黙 DO 変数はすべて 未定義になります。
  7. 定義済みの割り当てステートメントを実行すると、 等号の前の変数の一部または全部を未定義のままにします。
  8. 事前に作成されていないレコードを指定する直接アクセス・ステートメントを 実行すると、そのステートメントの入力リストで指定した変数がすべて未定義になります。
  9. INQUIRE ステートメントを実行すると、 変数 NAME=RECL=NEXTREC= は 未定義になります。
  10. 文字記憶単位が未定義になると、関連したすべての 文字記憶単位は未定義になります。

    数値記憶単位が未定義になると、関連したすべての数値記憶単位は 未定義になります。ただし、異なる型の関連した数値記憶単位を 定義したことにより、未定義になった場合を除きます (前述の (1) 参照)。

    倍精度の実数型のエンティティーが未定義になると、 それに全体が関連している倍精度の実数型エンティティーは すべて、未定義になります。

    未指定の記憶単位が未定義になると、関連した未指定の 記憶単位がすべて、未定義になります。

  11. 実引き数の対応する部分がステートメント・ラベルの値で 定義されている場合、プロシージャーに対する参照によって、 仮引き数の一部が未定義になります。
  12. 割り振り可能エンティティーの割り振りが解除されると、 そのエンティティーは未定義になります。 デフォルトの初期化が定義されていない、サイズがゼロ以外の オブジェクトに対して ALLOCATE ステートメントが正常に実行されると、 そのオブジェクトは未定義になります。
  13. エラー条件が存在する場合に、INQUIRE ステートメントを実行すると、IOSTAT= または FORTRAN 2003 の開始 IOMSG= FORTRAN 2003 の終了 指定子 (もしあれば) 内の変数を除くすべての照会指定子変数が未定義になります。
  14. プロシージャーが呼び出されると、以下のようになります。
    1. 実引き数に関連していないオプションの仮引き数は、未定義になります。
    2. INTENT(OUT) を持つ非ポインター仮引き数および それに関連した実引き数は未定義になります。ただし、デフォルト初期化を持つ 非ポインター直接コンポーネントを除きます。
    3. INTENT(OUT) を持つポインター仮引き数および それに関連した実引き数の関連付け状況は、未定義です。
    4. 実引き数の対応するサブオブジェクトが未定義の場合には、 仮引き数のサブオブジェクトは未定義になります。
    5. 関数結果変数は、未定義になります。ただし、 関数結果変数が STATIC 属性で宣言され、かつ前回の呼び出しで 定義されていた場合を除きます。
  15. ポインターの関連付け状況が未定義になるか、 解除されると、そのポインターは未定義になります。

    +---------------------------------Fortran 95---------------------------------+

  16. Fortran 95 では FORALL ステートメント または構成の実行が完了すると、index-name は未定義になります。

    +-----------------------------End of Fortran 95------------------------------+

    +-------------------------Fortran 2003 ドラフト標準--------------------------+

  17. RETURN または END ステートメントの実行によって変数が未定義になると、型 C_PTR の変数の値が未定義になった変数のいずれかの部分の C アドレスになっている場合、この変数は未定義になります。
  18. TARGET 属性を持つ変数が割り振り解除されると、型 C_PTR の変数の値が割り振り解除された変数のいずれかの部分の C アドレスになっている場合、この変数は未定義になります。

    +----------------------End of Fortran 2003 ドラフト標準----------------------+

    +----------------------------------IBM 拡張----------------------------------+

  19. 変数が PARALLELPARALLEL DODOPARALLEL SECTIONSPARALLEL WORKSHARESECTIONS、 または SINGLE ディレクティブの PRIVATE または LASTPRIVATE 文節のいずれかで指定されると、 スレッドの最初の作成時に変数のそれぞれの新しいスレッドのコピーが未定義になります。
  20. 変数が PARALLELPARALLEL DODOPARALLEL SECTIONSPARALLEL WORKSHARESECTIONS、または SINGLE ディレクティブの FIRSTPRIVATE 文節で 指定されると、それぞれの新しいスレッドがマスター・スレッドの定義と その変数の関連付け状況を複写します。 したがって、並列領域に入る時に変数のマスター・スレッドのコピーが 未定義になっている場合は、変数のそれぞれの新しいスレッドのコピーも未定義になります。
  21. INDEPENDENT ディレクティブ の NEW 文節で変数が指定されると、 その変数は続く DO ループの反復の先頭にくるごとに未定義になります。
  22. 非同期入力で変数が指定されると、 その変数は未定義になり、対応する WAIT ステートメントが 見つかるまで未定義のままになります。
  23. THREADPRIVATE 共通ブロックまたは THREADPRIVATE 変数が COPYIN 文節で指定された場合、 それぞれの新しいスレッドはマスター・スレッドの定義、割り振り、 およびその変数の関連付け状況を複写します。 したがって、並列領域に入る時に変数のマスター・スレッドのコピーが 未定義になっている場合は、変数のそれぞれの新しいスレッドのコピーも未定義になります。
  24. FORTRAN 2003 の開始THREADPRIVATE 共通ブロック変数または THREADPRIVATE 変数が ALLOCATABLE 属性を持っている場合、 作成された各コピーの割り振り状況は、現在割り当てられていない状況になります。 FORTRAN 2003 の終了
  25. THREADPRIVATE 共通ブロック変数または THREADPRIVATE 変数が POINTER 属性を持っており、この初期関連付け状況が、デフォルトの初期化または 明示的な初期化による関連解除である場合、それぞれのコピーの関連付け状況は関連付けが解除された状態になります。 そうでない場合、それぞれのコピーの関連付け状況は未定義です。
  26. THREADPRIVATE 共通ブロック変数または THREADPRIVATE 変数が ALLOCATABLE 属性と、POINTER 属性のどちらも持っておらず、 最初にデフォルトまたは明示的な初期化によって定義された場合、 それぞれのコピーは同じ定義を持ちます。 そうでない場合、それぞれのコピーは未定義です。

    +------------------------------End of IBM 拡張-------------------------------+

IBM Copyright 2003