XL Fortran for AIX V8.1.1

ランゲージ・リファレンス


変数の定義状況

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

文字タイプまたは複素数タイプの配列 (セクションを含む)、構造体、および変数は、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. さらに、デフォルトの初期化によって、変数が最初から定義される場合があります。

    +------------------------------Fortran 95 の終り------------------------------+

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

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

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

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

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

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

    +--------------------------------IBM 拡張の終り-------------------------------+

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

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

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

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

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

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

    +------------------------------Fortran 95 の終り------------------------------+

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

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

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

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

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

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

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

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

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

    +------------------------------Fortran 95 の終り------------------------------+

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

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

    +--------------------------------IBM 拡張の終り-------------------------------+


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]