+----------------------------------IBM 拡張----------------------------------+
目的
STATIC 属性を指定すると、変数のストレージ・クラスが静的になります。 つまり、プログラムの実行中は変数がメモリー内に残り、その値がプロシージャーの呼び出しの間で保存されます。
構文
.-,-------------------------------------------. V | >>-STATIC--+----+----stat_variable--+--------------------------+-+->< '-::-' '-/--initial_value_list--/-' |
規則
stat_variable が結果変数の場合、文字型または派生型であってはなりません。 仮引き数、自動オブジェクトおよびポインティング先に STATIC 属性 を指定することはできません。 STATIC 属性によって明示的に宣言された 変数を共通ブロック項目に指定することはできません。
同じ有効範囲単位内で 1 つの変数に対して STATIC 属性を 何回も指定することはできません。
ローカル変数はデフォルトで自動ストレージ・クラスを持っています。 呼び出しコマンドに関するデフォルト設定値の詳細については、「XL Fortran ユーザーズ・ガイド」の 『-qsave オプション』を参照してください。
STATIC として宣言される変数は、スレッド間で共用されます。 共用変数を含むアプリケーションをスレッド・セーフにするには、 ロックを使用して静的データへのアクセスを逐次化するか、 データをスレッド固有にしなければなりません。データをスレッド固有にするための 1 つの方法は、THREADLOCAL と宣言された COMMON ブロックに 静的データを移動することです。 Pthreads ライブラリー・モジュールには、ロックを使って データへのアクセスを逐次化するための mutex が備わっています。 詳細については、Pthreads ライブラリー・モジュールを参照してください。 また、CRITICAL ディレクティブの lock_name 属性 にも、データへのアクセスを逐次化するための機能が備わっています。 詳細については、CRITICAL / END CRITICALを参照してください。 THREADLOCAL ディレクティブを使うと、確実に共通ブロックをおのおののスレッドに対してローカルにすることができます。 詳細については、THREADLOCALを参照してください。
STATIC 属性と互換性のある属性 | ||||
---|---|---|---|---|
|
例
LOGICAL :: CALLED=.FALSE. CALL SUB(CALLED) CALLED=.TRUE. CALL SUB(CALLED) CONTAINS SUBROUTINE SUB(CALLED) INTEGER, STATIC :: 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
関連情報
+------------------------------End of IBM 拡張-------------------------------+