目的
COMMON ステートメントは共通ブロックとその内容を指定します。共通ブロックとは複数の有効範囲単位が共有できる 1 つのストレージのことです。共通ブロックを使うことによって、複数のプログラム単位で同一のデータを定義して参照し、ストレージを共有することが可能になります。
構文
>>-COMMON--+-----------------------------+--object_list---------> '-/--+-------------------+--/-' '-common_block_name-' >--+-----------------------------------------------------+----->< | .-------------------------------------------------. | | V | | '---+---+--/--+-------------------+--/--object_list-+-' '-,-' '-common_block_name-' |
>>-variable_name--+--------------------------------+----------->< '-(--explicit_shape_spec_list--)-' |
規則
object は、仮引き数、自動オブジェクト、割り振り可能オブジェクト、割り振り可能最終コンポーネントを持つ派生型のオブジェクト、ポインティング先、関数、関数結果、またはプロシージャーへのエントリーを参照することはできません。 object は STATIC または AUTOMATIC 属性を持つことはできません。
explicit_shape_spec_list がある場合、variable_name に POINTER 属性を持たせることはできません。各次元境界は定数宣言式でなければなりません。この書式は variable_name が DIMENSION 属性を持つことを指定します。
派生型の object の場合は、順序派生型でなければなりません。すべての最終コンポーネントが非ポインターであり、またすべてが非文字タイプ (または倍精度実数) であるか、あるいは文字タイプのいずれかである順序構造体の場合、構造体は、そのコンポーネントが共通ブロック内で直接列挙されているかのように処理されます。
共通ブロック内のポインター・オブジェクトとなれるのは、同じタイプ、型付きパラメーター、およびランクのポインターに関連したストレージだけです。
TARGET 属性を持つ共通ブロック内のオブジェクトは、別のオブジェクトとストレージを関連させることができます。オブジェクトは TARGET 属性を持ち、タイプと型付きパラメーターが同じでなければなりません。
+----------------------------------IBM 拡張----------------------------------+
BYTE タイプのポインターを INTEGER(1) および LOGICAL(1) タイプのポインターに関連するストレージにすることができます。 -qintlog コンパイラー・オプションを指定すると、同じ長さの整数および論理ポインターは関連したストレージになります。
+--------------------------------IBM 拡張の終り-------------------------------+
common_block_name を指定すると、object_list で指定されたすべての変数はその名前付き共通域ブロック内にあることを宣言されます。 common_block_name を省略すると、object_list で指定したすべての変数は無名共通ブロック内に置かれます。
1 つの有効範囲単位内では、同じ共通ブロックを同じ COMMON ステートメントあるいは別の COMMON ステートメントに複数回指定してもかまいません。同じ共通ブロックを指定するたびに、その名前で指定した共通ブロックが参照されます。共通ブロック名はグローバル・エンティティーです。
共通ブロック内の変数のデータ型は異なっていてもかまいません。文字データ型と非文字データ型を 1 つの共通ブロック内に混在させることができます。共通ブロック内の変数名を指定できるのは 1 つの有効範囲単位内では 1 つの COMMON ステートメントだけです。また、共通ブロック内の変数名を同一の COMMON ステートメント内で重複させることはできません。
+----------------------------------IBM 拡張----------------------------------+
デフォルトでは、共通ブロックはスレッドをまたがって共用されます。そのため、共通ブロック内のストレージ単位が、1 つ以上のスレッドによって更新される必要がある場合や、1 つのスレッドで更新され、別のスレッドから参照される場合に、COMMON ステートメントを使用すると、スレッドの安全性は守られなくなります。アプリケーションで、スレッドの安全性を確保したうえで COMMON を使用するには、ロックを使ってデータへのアクセスを逐次化するか、または、確実に共通ブロックをおのおののスレッドに対してローカルにしてください。 Pthreads ライブラリー・モジュールには、ロックを使ってデータへのアクセスを逐次化するための mutex が備わっています。詳細については、第 15 章, Pthreads ライブラリー・モジュールを参照してください。また、CRITICAL ディレクティブの lock_name 属性にも、データへのアクセスを逐次化するための機能が備わっています。 詳細については、CRITICAL / END CRITICALを参照してください。 THREADLOCAL および THREADPRIVATE ディレクティブを使用すると、共通ブロックを確実にそれぞれのスレッドのローカルにすることができます。詳細については、THREADLOCALおよび THREADPRIVATEを参照してください。
+--------------------------------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
関連情報