目的
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
関連情報