SAVE

目的

SAVE 属性は、変数および名前付き共通ブロックを定義した サブプログラムから制御が戻った後も、定義状況を保持したいオブジェクトおよび 名前付き共通ブロックの名前を指定します。

構文



>>-SAVE--+-----------------------------------------+-----------><
         |         .-,---------------------------. |
         |         V                             | |
         '-+----+----+-object_name-------------+-+-'
           '-::-'    '-/--common_block_name--/-'
 
 

規則

リストを指定していない SAVE ステートメントでは、 有効範囲単位内のすべての共通項目およびローカル変数の名前を ステートメントに指定したかのように処理されます。 SAVE 属性を持つ共通ブロック名は、その名前付き共通ブロック内の すべてのエンティティーを指定することと同じ効果を持ちます。

関数サブプログラムまたはサブルーチン・サブプログラム内 では、SAVE 属性で指定した変数は、そのサブプログラムで RETURN また は END ステートメントを実行しても未定義にはなりません。

object_name に仮引き数、ポインティング先、プロシージャー、 自動オブジェクト、または共通ブロック・エンティティーの名前を指定することはできません。

サブプログラムで RETURN または END ステートメントを 実行するときに、SAVE 属性を持たせて指定したローカル・エンティティー (共通ブロックに入っていないもの) が定義済みの状態であれば、 このエンティティーは、同じサブプログラムが次に参照されるときに、同じ値で定義されます。 保管されたオブジェクトはサブプログラムの すべてのインスタンスによって共用されます。

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

XL Fortran では、関数結果は SAVE 属性を持つことができます。 関数結果に SAVE 属性を持たせることを示すには、SAVE 属性で 明示的に関数結果名を指定しなければなりません。 つまり、リストを指定していない SAVE ステートメントは、 関数結果に SAVE 属性を提供することはありません。

SAVE として宣言される変数は、スレッド間で共用されます。 共用変数を含むアプリケーションをスレッド・セーフにするには、 ロックを使用して静的データへのアクセスを逐次化するか、 データをスレッド固有にしなければなりません。 データをスレッド固有にするための 1 つの方法は、THREADLOCAL と 宣言された名前付き COMMON ブロックに静的データを移動することです。 Pthreads ライブラリー・モジュールには、ロックを使って データへのアクセスを逐次化するための mutex が備わっています。 詳細については、Pthreads ライブラリー・モジュールを参照してください。 また、CRITICAL ディレクティブの lock_name 属性 にも、データへのアクセスを逐次化するための機能が備わっています。 詳細については、CRITICAL / END CRITICALを参照してください。 THREADLOCAL ディレクティブを使うと、確実に共通ブロックをおのおののスレッドに対してローカルにすることができます。 詳細については、THREADLOCALを参照してください。

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

SAVE 属性と互換性のある属性





LOGICAL :: CALLED=.FALSE.
CALL SUB(CALLED)
CALLED=.TRUE.
CALL SUB(CALLED)
CONTAINS
  SUBROUTINE SUB(CALLED)
    INTEGER, SAVE :: J
    LOGICAL :: CALLED
    IF (CALLED.EQV..FALSE.) THEN
      J=2
    ELSE
      J=J+1
    ENDIF
    PRINT *, J                  ! Output on first call is 2
                                ! Output on second call is 3
  END SUBROUTINE
END

関連情報

IBM Copyright 2003