共用体の各メンバーは、構造体のメンバーと同じ方法でマップされます。 つまり、それぞれのメンバー (共用体でない場合) は、 構造体のメンバーの場合と同様にマップされます。 これによって、共用体の各メンバーの最初の記憶場所は、 各メンバーがそれぞれ異なる位置合わせを必要とし、 さらに (それによって) メンバーの開始位置より 前にそれぞれ異なる埋め込みを必要とする場合は、 互いにオーバーレイすることはありません。
次の共用体について考えてみましょう。
dcl
1 A union,
2 B,
3 C char(1),
3 D fixed bin(31),
2 E,
3 F char(2),
3 G fixed bin(31);
3 バイトの埋め込みが、A および B の間に追加されます。 A と E の間には 2 バイト追加されます。
共用体の各メンバーの先頭の記憶位置を同じにするには、各先頭メンバーがそれぞれ同じ位置合わせ要件を持ち、さらにメンバー (またはそのメンバーのメンバー) 内での最高位の位置合わせと同じになるようにしてください。
以降の説明は、小構造体または要素変数のいずれかである構造体または共用体の メンバーに適用されます。
どの構造 (大構造体または小構造体) でも、その長さ、位置合わせの要件、 および 8 バイト境界からの相対的な位置は、構造体のメンバーの長さ、 位置合わせの要件、および相対位置によって決まります。 各レベルおよび構造体全体でこれらの要件を決定するプロセスを、 構造体のマッピング といいます。
レコード単位の入出力を使用するとき、ある構造体にどのくらいの長さのレコードが必要であるかを判別します。 また、位置指定モードの入出力では、構造体の位置合わせを正しく行うために必要な埋め込みまたは再配置の量を 判別します。このような場合、構造体のマッピングを通して判別することができます。
構造体のマッピングのプロセスは、構造体のメンバー相互間に生じる使用されない ストレージ (埋め込み) の量を最小にします。 これは、以下に説明する規則に (事実上) 従ってこの処理全体を完了させてから、構造体にストレージを割り振ります。
構造体のマッピングは、物理的な処理ではありません。 「シフトする」や「相対位置変更する」などの用語は、 単に説明の便宜で使用するもので、 実際にストレージ内で移動が行われるわけではありません。 構造体にストレージが割り振られるとき、マッピング処理の結果として相対位置が すでに知られています。
構造体全体のマッピングでは、項目 (エレメントまたはすでに個々のマッピングが判別されている小構造体) が順に対として組み合わされていきます。 1 つの対が作られると、それは 1 つの単位となり、別の単位と組み合わされます。構造体全体のマッピングが終わるまで、この操作が続けられます。 したがって、このプロセスの規則は、次の 2 種類に分類されます。
以下にこれらの規則を説明し、これらの規則の適用例を示して詳しく説明します。 構造体エレメントの論理レベル とレベル番号 の違いを理解する必要があります。 構造体の宣言が一定のレベル番号で行われたり適切な字下げをして 行われていれば (規則の説明のあとに詳しい例示があります)、 論理レベルについてはすぐに明らかになります。 いずれにしても、構造体宣言の始まりから順番に各項目に下記の規則を 適用していけば、その構造体の各項目の論理レベルを判別することができます。
次の例では、下の行の数字は、宣言内の各項目の論理レベルを示しています。
dcl 1 A, 4 B, 5 C, 5 D, 3 E, 8 F, 7 G;
1 2 3 3 2 3 3
対を作る順序を決める際の手順は、次のとおりです。
ここでは説明の便宜上、ストレージをいくつかの連続したダブルワードと考えます。 各ダブルワードは 8 バイトで、0 から 7 までの番号が付いているものとし、 この番号でダブルワード境界からのオフセットを表します。 さらに、構造体の始まりからの長さやオフセットを算出できるように、 各バイトには、任意のバイトから始めて 0 から順に連続した番号が 付いているものとします。
この作業が完了すると、 この 2 つのエレメントの間の埋め込みは最少量になっており、 後続の作業中に変わることはありません。 対は固定長の単位および位置合わせ要件となります。その長さは 2 つの長さの合計と埋め込みであり、その位置合わせ要件は 2 つの位置合わせ要件の高い方 (それらが異なる場合) です。
以下に示す構造体のマッピングの例は、ALIGNED と宣言されている構造体に 適用される規則を示したものです。 ALIGNED と宣言された構造体のマッピングは、多くの位置合わせ要件があるため、より複雑です。 UNALIGNED 属性を指定すると、ハーフワード、フルワード、 およびダブルワードの位置合わせ要件が 1 バイトに引き下げられ、 ビット・ストリングの位置合わせ要件が 1 ビットに引き下げられます。 構造体のマッピングについては同じ規則が適用されますが、引き下げられた位置合わせ要件が使われます。 使われないストレージが生じるのは、 構造体にビット・ストリングが含まれていて、 バイト内でビットの埋め込みが行われたときだけです。
AREA データは、位置合わせなしにすることはできません。
構造体に UNALIGNED 属性があり、位置合わせできないエレメントがある場合は、 UNALIGNED はそのエレメントについては無視されます。 エレメントが位置合わせされ、エラー・メッセージが出されます。 例えば、プログラムで次のように宣言した場合、 C には ALIGNED 属性が与えられます (継承される 属性 UNALIGNED は AREA と矛盾するからです)。
declare 1 A unaligned,
2 B,
2 C area(100);
次の例では、例のように宣言された構造体に、 構造体のマッピングの規則がどのように適用されるかを示します。
declare 1 A aligned,
2 B fixed bin(31),
2 C,
3 D float decimal(14),
3 E,
4 F entry,
4 G,
5 H character(2),
5 I float decimal(13),
4 J fixed binary(31,0),
3 K character(2),
3 L fixed binary(20,0),
2 M,
3 N,
4 P fixed binary(15),
4 Q character(5),
4 R float decimal(2),
3 S,
4 T float decimal(15),
4 U bit(3),
4 V char(1),
3 W fixed bin(31),
2 X picture '$9V99';
最も低い論理レベルにある小構造体は G です。 したがって、G が最初にマッピングされます。 次に、E がマッピングされ、N、S、 C、M がこの順序でマッピングされます。
それぞれの小構造体ごとに、プロセスのステップを表 図 10 に示し、 そのプロセスを視覚的に捕えた図を 図 11 に示します。 最後に、図 17 に示すように、大構造体 A がマッピングされます。
この例の終わりには、各メンバーが A の始まりからどのくらい 離れているか (オフセット) を示す表の形で、 A の構造体マップを示します (図 18)。