COMMON

:実行形式プログラムの任意の有効域から参照できる,物理的記憶域の 1 つまたは複数の連続した領域 (ブロック) を定義します (このブロックは共通ブロックと呼ばれます)。また,COMMON 文は,各共通ブロック内での変数と配列の格納順序も定義し,これによってデータ項目の位置合わせの失敗を防ぎます。

共通ブロックには名前付きのものと,名前がないもの (無名共通ブロック) があります。

形式

COMMON [/[cname]/] var-list [[,] /[cname]/ var-list]...

cname
共通ブロックの名前。無名共通ブロックでは,名前を省略することができます (//)。

var-list
変数名のコンマで区切られた並び。

変数は,仮引数,割付け配列,自動割付けオブジェクト,関数,関数結果,または手続のエントリ・ポイント名であってはなりません。PARAMETER 属性を持つことはできません。構造型のオブジェクトが宣言される場合,オブジェクトは連続型でなくてはなりません。

規則と振る舞い

共通ブロックは大域的な言語要素で,サブルーチンや関数のようなプログラム中の他の大域的な言語要素と同じ名前をもつことはできません。

どの共通ブロック名 (または無名共通ブロック) は,プログラム単位中の 1 つ以上の COMMON 文で 1 つ以上宣言することができます。連続して宣言される同じ共通ブロック名に続く並びは,その名前に関連するブロックに対する並びの継続として取り扱われます。以下の COMMON 文を考えます。

	COMMON /ralph/ ed, norton, trixie
	COMMON /     / fred, ethel, lucy
	COMMON /ralph/ audrey, meadows
	COMMON /jerry/ mortimer, tom, mickey
	COMMON melvin, purvis

これらは,次の COMMON 文と等価です。

	COMMON /ralph/ ed, norton, trixie, audrey, meadows
	COMMON         fred, ethel, lucy, melvin, purvis
	COMMON /jerry/ mortimer, tom, mickey

変数は,同じ有効域の中では 1 つの共通ブロック中でしか指定することができません。

配列を指定した場合,その後に形状明示配列指定を続けることができます。配列は POINTER 属性を持っていてはならず,指定中のすべての境界は定数宣言式でなくてはなりません。

ポインタは,同じ型,種別パラメタ,および次元数のポインタにしか結合できません。

TARGET 属性を持つオブジェクトは,TARGET 属性を持ち,同じ型と種別パラメタを持つ他のオブジェクトにしか結合できません。

ポインタ以外のオブジェクトは,他のポインタ以外のオブジェクトにしか結合できませんが,その結合のあり方は,以下のように,型によって変わります。

変数の型 結合される変数の型
組込み数値 1 または数値連続型 2 どちらの型でも可能
基本文字型または文字連続型 2 どちらかの型
その他のすべての組込み型 同じ型と種別パラメタを持っている必要があります
その他のすべての連続型 同じ型でなくてはなりません
1 基本整数型,基本実数型,倍精度実数型,基本複素数型,倍精度複素数型,または基本論理型
2 数値連続型または文字連続型のオブジェクトが共通ブロックに現れる場合,共通ブロック並びに個々の成分が直接に列挙されているように扱われます。

このように,変数は異なる数値型であっても結合することができます。たとえば,以下の文は有効です。

	INTEGER A(20)
	REAL Y(20)
	COMMON /QUANTA/ A, Y

異なるプログラム単位の共通ブロックが同じ名前を持っている場合,それらのプログラム単位が 1 つの実行形式プログラムに結合されると,共通ブロックは同じ記憶域を共有することになります。

言語要素は共通ブロック中で 1 つずつ記憶域を割り付けられます。このため,1 つのプログラム単位で COMMON 文によって割り付けられた言語要素のデータ型は,他のプログラム単位によって共通ブロックに入れられた言語要素のデータ型と一致しなくてはなりません。

プログラム単位 A プログラム単位 B
COMMON CENTS INTEGER(2) MONEY
... COMMON MONEY
  ...

これらのプログラム単位が 1 つの実行形式プログラムに結合されたとき,2 バイトの整数変数 MONEY が,実数変数 CENTS の下位アドレスの 2 バイトに対応させられると,誤った結果が生じる可能性があります。

名前付き共通ブロックは,各プログラム単位で同じ大きさを持つように宣言しなければなりません。無名共通ブロックは,異なったプログラム単位で異なった大きさを持つことができます。


注意:Tru64 UNIX,Linux,および Windows システムでは,共通ブロックが DATA 文によって初期化された場合,初期値を含んでいるモジュールは,共通ブロックを定義している最大の長さで宣言しなくてはなりません。

この制限は,すべてのモジュールを一緒にコンパイルする場合には適用されません。


互換性

CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB

関連情報

BLOCK DATADATAEQUIVALENCEEQUIVALENCECOMMON の相互作用MODULE記憶列結合宣言式

	PROGRAM MyProg
	COMMON i, j, x, k(10)
	COMMON /mycom/ a(3)
	...
	END
	SUBROUTINE MySub
	COMMON pe, mn, z, idum(10)
	COMMON /mycom/ a(3)
	...
	END

次の例で,主プログラム中の COMMON 文は,無名共通ブロックに HEATX を入れ,BLK1 という名前付き共通ブロックに KILOQ を入れます。

主プログラム 副プログラム
COMMON HEAT,X /BLK1/KILO,Q SUBROUTINE FIGURE
... COMMON /BLK1/LIMA,R / /ALFA,BET
  ...
CALL FIGURE  
... RETURN
  END

サブルーチン中の COMMON 文により,ALFABET は,無名共通ブロックの HEATX と同じ記憶位置を共有することになります。これにより,LIMAR は,BLK1 の中の KILOQ と同じ記憶位置を共有します。

次の例は,COMMON 文を使って配列を宣言する方法を示しています。

	COMMON / MIXED / SPOTTED(100), STRIPED(50,50)

以下の例は,異なったプログラム単位中のサブルーチン間の有効な結合を示しています。オブジェクトの並びは,データ・オブジェクトの個数,型,種別で一致しています。

	SUBROUTINE unit1
	REAL(8)      x(5)
	INTEGER      J
	CHARACTER    str*12
	TYPE(member) club(50)
	COMMON / blocka / x, j, str, club
	...

	SUBROUTINE unit2
	REAL(8)      z(5)
	INTEGER      m
	CHARACTER    chr*12
	TYPE(member) myclub(50)
	COMMON / blocka / z, m, chr, myclub
	...

BLOCK DATA」の例も参照してください。