目的
EQUIVALENCE ステートメントは 1 つの有効範囲単位内で複数 のオブジェクトが同一のストレージを共用するように指定します。
構文
.-,----------------------------------------. V | >>-EQUIVALENCE----(--equiv_object--,--equiv_object_list--)-+---><
規則
equiv_object は、ターゲット、ポインター、仮引き数、関数名、ポインティング先、エントリー名、結果名、構造体コンポーネント、名前付き定数、自動データ・オブジェクト、割り振り可能オブジェクト、非順序派生型のオブジェクト、ポインターまたは割り振り可能コンポーネントを含む順序派生型のオブジェクト、またはこれらのいずれのサブオブジェクトであってはなりません。
+-------------------------Fortran 2003 ドラフト標準--------------------------+
BIND 属性を持つ変数、または BIND 属性を持つ共通ブロックの メンバーである変数は、EQUIVALENCE ステートメントのオブジェクトにすることはできません。
+----------------------End of Fortran 2003 ドラフト標準----------------------+
一対の括弧内で指定されたすべての項目は、始点が同じであるストレージ 単位を占めるため、それらの項目は関連付けられます。 これを等価関連付けと呼びます。 等価関連付けによって他の項目も同様に関連付けられることがあります。
ストレージに関連した記憶装置の デフォルトの初期化を指定することができます。 ただし、デフォルトの初期化を提供する デフォルトのオブジェクトまたはサブオブジェクトは、 同じ型でなければなりません。 そのオブジェクトまたはサブオブジェクトは、同じ型付きパラメーターでなければならず、記憶単位に同じ値を 提供しなければなりません。
EQUIVALENCE ステートメントに配列エレメントを指定する場合、 配列の次元の個数を超えて添え字の個数を指定することはできません。 多次元配列を指定するのに単一の添え字 n を持つ配列エレメントを 使用すると、配列のストレージ順序内の n エレメントが指定されます。 それ以外の場合、 XL Fortran は、脱落している添え字を配列の対応する次元 の下限値で置き換えます。添え字がなくサイズが 0 でない配列は、配列の最初のエレメントを参照します。
equiv_object が派生型の場合、それは順序派生型でなければなりません。
+----------------------------------IBM 拡張----------------------------------+
EQUIVALENCE ステートメント内でオブジェクトを使用できる場合、順序派生型のオブジェクトは 順序派生型または組み込みデータ型のその他のオブジェクトと同等と見なすことができます。
XL Fortran では、関連する項目は組み込み型であっても順序派生型であってもかまいません。 項目のデータ型が異なっていても、EQUIVALENCE ステートメントによって型の変換が起こることは ありません。
+------------------------------End of IBM 拡張-------------------------------+
関連する項目の長さが異なっていてもかまいません。
サイズが 0 であるすべての項目は、サイズが 0 ではない順序列の 最初の文字ストレージ単位と同じストレージを共用します。
EQUIVALENCE ステートメントを使っても、2 つの異なる 共通ブロックのストレージ順序が関連させられることはありません。 また、1 つのストレージ順序内に同一のストレージ単位が 2 回以上現れる ように指定することはできません。 EQUIVALENCE ステートメントは、それ自身や、 前に EQUIVALENCE ステートメントで設定された関連付け と矛盾してはいけません。
EQUIVALENCE ステートメントを使用して、共通ブロック内に ない名前と共通ブロック内の名前との間でストレージを共用させることができます。
EQUIVALENCE グループによって宣言されたオブジェクトが
PROTECTED 属性を持つように指定した場合、その EQUIVALENCE
グループで指定されたオブジェクトはすべて PROTECTED 属性を持たなければなりません。
EQUIVALENCE ステートメントを使用して共通ブロックを拡張 できますが、拡張部分は最後の入り口の後に追加できるだけで、 最初の入り口の前には追加できません。 たとえば、EQUIVALENCE ステートメントを使用して、共通ブロック 内の変数に関連させようとする変数が配列エレメントの場合、その配列の他のエレメント の暗黙の関連付けによって、共通ブロックの大きさが拡張する場合があります。
DOUBLE PRECISION A(3) REAL B(5) EQUIVALENCE (A,B(3))
ストレージ単位の関連付け:
| | | | | | | | | Array A: | A(1) | A(2) | A(3) | Array B: | B(1) | B(2) | B(3) | B(4) | B(5) |
次の例は、2 つの項目の関連付けの結果、別の関連付けが行われる ことを示しています。
AUTOMATIC A CHARACTER A*4,B*4,C(2)*3 EQUIVALENCE (A,C(1)),(B,C(2))
ストレージ単位の関連付け:
| | | | | | | | Variable A: | A | Variable B: | B | Array C: | C(1) | C(2) |
XL Fortran は A と B の両方を C クラス に関連させるので、A と B は互いに関連し合う ことになります。これらはすべて、自動ストレージ・クラスを持ちます。
INTEGER(4) G(2,-1:2,-3:2) REAL(4) H(3,1:3,2:3) EQUIVALENCE (G(2),H(1,1)) ! G(2) is G(2,-1,-3) ! H(1,1) is H(1,1,2)
関連情報