目的
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 が備わっています。詳細については、第 15 章, Pthreads ライブラリー・モジュールを参照してください。また、CRITICAL ディレクティブの lock_name 属性にも、データへのアクセスを逐次化するための機能が備わっています。 詳細については、CRITICAL / END CRITICALを参照してください。 THREADLOCAL ディレクティブを使うと、確実に共通ブロックをおのおののスレッドに対してローカルにすることができます。詳細については、THREADLOCALを参照してください。
+--------------------------------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
関連情報