目的
COMMON ステートメントは共通ブロックとその内容を指定します。 共通ブロックとは複数の有効範囲単位が共有できる 1 つのストレージ のことです。共通ブロックを使うことによって、複数のプログラム単位 で同一のデータを定義して参照し、ストレージを共有することが可能になります。
構文
>>-COMMON--+-----------------------------+--object_list---------> '-/--+-------------------+--/-' '-common_block_name-' >--+-----------------------------------------------------+----->< | .-------------------------------------------------. | | V | | '---+---+--/--+-------------------+--/--object_list-+-' '-,-' '-common_block_name-' |
>>-variable_name--+--------------------------------+----------->< '-(--explicit_shape_spec_list--)-' |
規則
object は、仮引き数、自動オブジェクト、割り振り可能オブジェクト、割り振り可能最終コンポーネントを 持つ派生型のオブジェクト、pointee、関数、関数結果、またはプロシージャーへの入り口を参照することは できません。 object は STATIC または AUTOMATIC 属性を持つことはできません。
explicit_shape_spec_list がある場合、variable_name に POINTER 属性を持たせることはできません。 各次元境界は定数宣言式でなければなりません。 この書式は variable_name が DIMENSION 属性を 持つことを指定します。
object が派生型である場合は、順序派生型でなければなりません。 すべての最終コンポーネントが非ポインターであり、 すべてが文字型であるか、 またはすべてがデフォルト整数、デフォルト実数、デフォルト複素数、デフォルト論理、 倍精度実数のいずれかの型である順序構造体の場合、 構造体は、そのコンポーネントが共通ブロック内で直接列挙されているかのように処理されます。
共通ブロック内のポインター・オブジェクトとなれるのは、型、型付きパラメーター、およびランクが同じであるポインターに関連したストレージだけです。
TARGET 属性を持つ共通ブロック内のオブジェクトは、 別のオブジェクトとストレージを関連させることができます。 そのオブジェクトは TARGET 属性を持ち、型と型付きパラメーターが同じでなければなりません。
+----------------------------------IBM 拡張----------------------------------+
BYTE 型のポインターを INTEGER(1) およ び LOGICAL(1) 型のポインターに関連するストレージにすることができます。 -qintlog コンパイラー・オプションを指定すると、同じ長さ の整数および論理ポインターは関連したストレージになります。
+------------------------------End of IBM 拡張-------------------------------+
common_block_name を指定すると、object_list で 指定されたすべての変数はその名前付き共通域ブロック内にあることを 宣言されます。 common_block_name を省略すると、object_list で 指定したすべての変数は無名共通ブロック内に置かれます。
1 つの有効範囲単位内では、同じ共通ブロックを同じ COMMON ステートメント あるいは別の COMMON ステートメントに複数回指定しても かまいません。 同じ共通ブロックを指定するたびに、その名前で指定した共通ブロックが 参照されます。 共通ブロック名はグローバル・エンティティーです。
共通ブロック内の変数のデータ型は異なっていてもかまいません。 文字データ型と非文字データ型を同じ共通ブロック内に混在させることができます。 共通ブロック内の変数名を指定できるのは 1 つの有効範囲単位内で は 1 つの COMMON ステートメントだけです。 また、共通ブロック内の変数名を同一の COMMON ステートメント内で重複させることはできません。
+-------------------------Fortran 2003 ドラフト標準--------------------------+
BIND 属性を持つ共通ブロックでは、 宣言される各有効範囲単位に BIND 属性および同じバインディング・ラベルが必要です。 外部リンケージを持つ C 変数は、以下の場合に、BIND 属性を 持つ共通ブロックと相互運用可能です。
+----------------------End of Fortran 2003 ドラフト標準----------------------+
+----------------------------------IBM 拡張----------------------------------+
デフォルトでは、共通ブロックはスレッドをまたがって共用され ます。そのため、共通ブロック内のストレージ単位が、1 つ以上のスレッドに よって更新される必要がある場合や、1 つのスレッドで更新され、別のスレッド から参照される場合に、COMMON ステートメントを使用すると、 スレッドの安全性は守られなくなります。 アプリケーションで、スレッド・セーフな方法で COMMON を使用するには、ロックを使ってデータへの アクセスを逐次化するか、または、共通ブロックがそれぞれのスレッドに対して確実に ローカルになるようにします。 Pthreads ライブラリー・モジュールには、ロックを使って データへのアクセスを逐次化するための mutex が備わっています。 詳細については、Pthreads ライブラリー・モジュールを参照してください。 また、CRITICAL ディレクティブの lock_name 属性 にも、データへのアクセスを逐次化するための機能が備わっています。詳細については、CRITICAL / END CRITICALを参照してください。 THREADLOCAL および THREADPRIVATE ディレクティブを使用すると、共通ブロックを確実にそれぞれのスレッドのローカルになるようにすることができます。 詳細については、THREADLOCALおよび THREADPRIVATEを 参照してください。
+------------------------------End of IBM 拡張-------------------------------+
1 つの実行可能プログラム域では、サイズが 0 でない同じ名前の すべての名前付き共通ブロックは始点を同じくする同じ記憶単位を持ちます。 1 つの実行可能プログラム内には、無名共通ブロックを 1 つ置くことができます。 サイズが 0 ではない無名共通ブロックを参照するすべての有効範囲単位は、 始点を同じくする同じ有効範囲単位を参照します。
サイズが 0 で名前が同じすべての共通ブロックは、 同じストレージを共用します。 サイズが 0 であるすべての無名共通ブロックは、サイズが 0 でない 無名共通ブロックの最初の記憶単位と同じストレージを共用します。 使用関連付けまたはホスト関連付けを使用することにより、 同一の有効範囲単位内でこれらの関連オブジェクトにアクセスできるように なります。
関連付けは記憶単位ごとに実行されるため、共通ブロック内の 変数の名前およびタイプは別の有効範囲単位では異なっていてもかまいません。
有効範囲単位の共通ブロック内の変数には、COMMON ステートメントで名前が現れる順に、 ストレージが割り当てられます。
EQUIVALENCE ステートメントを 使用して共通ブロックを拡張 できますが、拡張部分は最後の入り口の後に追加できるだけで、 最初の入り口の前には追加できません。たとえば、次のステートメントでは X を指定します。
COMMON /X/ A,B ! common block named X REAL C(2) EQUIVALENCE (B,C)
共通ブロック X の内容は、次のように指定されます。
| | | | | | | | | | | | | Variable A: | A | Variable B: | B | Array C: | C(1) | C(2) |
有効範囲単位内の共通ブロックのストレージの順番に影響を与える ステートメントは COMMON と EQUIVALENCE です。 使用関連付けまたはホスト関連付けによって共通に アクセス可能になる変数はこの限りではありません。
EQUIVALENCE ステートメントを使って、2 つの異なる 共通ブロックの記憶順序を関連させることはできません。 モジュールの有効範囲単位内で共通ブロックを宣言することはできますが、 使用関連付けを介してモジュールからエンティティーにアクセスする 他の有効範囲単位内で共通ブロックを宣言することはできません。
COMMON を使用するとデータの境界合わせが正しく実行 されない場合があります。 境界合わせが正しく実行されなかったデータを使用すると、プログラムの パフォーマンスに悪影響を与えます。
共通ブロックのサイズはストレージのバイト数に等しくなります。それは 共通ブロック内のすべての変数を収容するのに必要なサイズです。これには、 等価関連付けによって拡張された部分も含まれます。
名前付き共通ブロックまたはその一部を複数の有効範囲単位内で初期化する
と、初期値は未定義になります。
このような問題を回避するには、ブロック・データ・プログラム単位
またはモジュール
を使用して、名前付き共通ブロックを初期化してください。
初期化は、各名前付き共通ブロックごとに、それぞれ 1 つのブロック・データ・プログラム単位
または
モジュール
内だけで
行う必要があります。
例
INTEGER MONTH,DAY,YEAR COMMON /DATE/ MONTH,DAY,YEAR REAL R4 REAL R8 CHARACTER(1) C1 COMMON /NOALIGN/ R8,C1,R4 ! R4 will not be aligned on a ! full-word boundary
関連情報