文:記憶領域がプログラム単位中の 2 つ以上のオブジェクトによって共有されることを指定します。これにより,記憶領域を共有するオブジェクトの全体的または部分的な記憶列結合が行われます。
形式
EQUIVALENCE (equiv-list) [,(equiv-list)]...
equiv-list
2 つ以上の変数,配列要素,または部分列の,コンマで区切られた並び (等価集合とも呼ばれます)。構造型のオブジェクトを指定する場合,そのオブジェクトは連続型でなくてはなりません。オブジェクトが TARGET 属性を持つことはできません。
添字または部分列引用中のすべての式は,整数型初期値式でなくてはなりません。部分列の長さがゼロであってはなりません。
規則と振る舞い
以下のオブジェクトは EQUIVALENCE 文の中で指定することができません。
仮引数
割付け配列
ポインタ
非連続構造型のオブジェクト
構造体にポインタを含んでいる連続構造型のオブジェクト
関数名,エントリ・ポイント名,または結果名
名前付き定数
構造体成分
上記のいずれかのオブジェクトの部分オブジェクト
EQUIVALENCE 文を使用すると,1 つの括弧で囲まれたすべての言語要素が,同じ記憶位置から始まる記憶域に割り付けられます。
オブジェクトの結合のあり方は,以下のように型によって変わります。
オブジェクトの型 | 結合されるオブジェクトの型 |
組込み数値型 1 または数値連続型 | どちらの型でも可能 |
基本文字型または文字連続型 | どちらかの型 2 |
その他のすべての組込み型 | 同じ型と種別パラメタを持っている必要があります |
その他のすべての連続型 | 同じ型でなくてはなりません |
1 基本整数型,基本実数型,倍精度実数型,基本複素数型,倍精度複素数型,または基本論理型
2 長さが等しい必要はありません。 |
このように,オブジェクトは異なる数値型であっても結合することができます。たとえば,以下の文は有効です。
INTEGER A(20) REAL Y(20) EQUIVALENCE(A, Y)
基本文字型のオブジェクトは同じ長さである必要はありません。次の例は,文字変数 D を,文字配列 F の (6 つあるうちの) 最後の 4 つの文字に結合しています。
CHARACTER(LEN=4) D CHARACTER(LEN=3) F(2) EQUIVALENCE(D, F(1)(3:))
異なるデータ型を持つ言語要素を結合できるのは,1 つのデータ型の複数の成分が,より次元数の高いデータ型の 1 つの成分と記憶域を共有できるからです。たとえば,整数変数を複素数変数と等価にすると,整数変数は複素数変数の実部と記憶域を共有します。
記憶列の中では,同じ記憶単位を複数回宣言することはできません。また,連続した記憶単位を,それらが非連続になるような方法で宣言することはできません。
Visual Fortran では,文字要素と非文字要素を結合することができます。以下に例を示します。
CHARACTER*1 char1(10) REAL reala, realb EQUIVALENCE (reala, char1(1)) EQUIVALENCE (realb, char1(2))
EQUIVALENCE 文は,複次元配列の第 1 添字のみを必要とします (STRICT コンパイラ指示文が有効になっていなければ)。たとえば,配列宣言 var(3,3),var(4) を EQUIVALENCE 文で使うことができます。引用は,配列 (var(1,2)) の第 4 要素に対して行われ,第 4 行または列の始めに対して行われるわけではありません。
STRICT 指示文を使う場合,結合したい変数と配列の種別に以下の規則が適用されます。
EQUIVALENCE オブジェクトが,基本整数型,基本実数型,倍精度実数型,基本複素数型,基本論理型,または,すべてが数値または論理構成要素の連続構造型であれば,EQUIVALENCE 文のすべてのオブジェクトはそれらの型の 1 つでなければなりません。しかし,それらが同じ型である必要はありません。
EQUIVALENCE オブジェクトが,基本文字型またはすべてが文字成分の連続構造型であれば,EQUIVALENCE 文のすべてのオブジェクトはこれらの型の 1 つでなければなりません。長さは同じである必要はありません。
EQUIVALENCE オブジェクトが,純粋な数値または純粋な文字ではない連続構造型であれば,EQUIVALENCE 文のすべてのオブジェクトは同じ構造型でなければなりません。
EQUIVALENCE オブジェクトが,基本 (たとえば,INTEGER(1)) ではなく組込み型であれば,EQUIVALENCE 文のすべてのオブジェクトは同じ型と種別でなければなりません。
互換性
CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB
関連情報
EQUIVALENCE 文,STRICT 指示文,記憶列結合,構造型,初期値式
例
次の EQUIVALENCE 文は,X(1) と X(2) に対して同じ記憶単位を宣言しているため無効です。
REAL, DIMENSION(2), :: X REAL :: Y EQUIVALENCE(X(1), Y), (X(2), Y)
次の EQUIVALENCE 文は,A(1) と A(2) が連続にならないため無効です。
REAL A(2) DOUBLE PRECISION D(2) EQUIVALENCE(A(1), D(1)), (A(2), D(2))
次の例では,EQUIVALENCE 文によって,整数配列 IARR の 4 つの要素が,倍精度変数 DVAR と同じ記憶域を共有するようになります。
DOUBLE PRECISION DVAR INTEGER(KIND=2) IARR(4) EQUIVALENCE(DVAR, IARR(1))
次の例では,EQUIVALENCE 文によって,文字変数 KEY および STAR の最初の文字が,同じ記憶位置を共有するようになります。文字変数 STAR は部分文字列 KEY(1:10) と等価になります。
CHARACTER KEY*16, STAR*10 EQUIVALENCE(KEY, STAR)
以下に別の例を示します。
CHARACTER name, first, middle, last DIMENSION name(60), first(20), middle(20), last(20) EQUIVALENCE (name(1), first(1)), (name(21), middle(1)) EQUIVALENCE (name(41), last(1))
以下の例を考えます。
CHARACTER (LEN = 4) :: a, b CHARACTER (LEN = 3) :: c(2) EQUIVALENCE (a, c(1)), (b, c(2))
これは,以下の配置になります。
1 2 3 4 5 6 7 a(1:1) a(2:2) a(3:3) a(4:4) b(1:1) b(2:2) b(3:3) b(4:4) c(1)(1:1) c(1)(2:2) c(1)(3:3) c(2)(1:1) c(2)(2:2) c(2)(3:3)
a の第 4 要素,B の第 1 要素,および c(2) の第 1 要素は,同じ記録単位を共有していることに注意してください。