Rational Developer for System z
Enterprise PL/I for z/OS, Version 3.8, 言語解説書

構造体および共用体のマッピング

共用体の各メンバーは、構造体のメンバーと同じ方法でマップされます。 つまり、それぞれのメンバー (共用体でない場合) は、 構造体のメンバーの場合と同様にマップされます。 これによって、共用体の各メンバーの最初の記憶場所は、 各メンバーがそれぞれ異なる位置合わせを必要とし、 さらに (それによって) メンバーの開始位置より 前にそれぞれ異なる埋め込みを必要とする場合は、 互いにオーバーレイすることはありません。

次の共用体について考えてみましょう。

  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 の間に追加されます。 AE の間には 2 バイト追加されます。

共用体の各メンバーの先頭の記憶位置を同じにするには、各先頭メンバーがそれぞれ同じ位置合わせ要件を持ち、さらにメンバー (またはそのメンバーのメンバー) 内での最高位の位置合わせと同じになるようにしてください。

以降の説明は、小構造体または要素変数のいずれかである構造体または共用体の メンバーに適用されます。

どの構造 (大構造体または小構造体) でも、その長さ、位置合わせの要件、 および 8 バイト境界からの相対的な位置は、構造体のメンバーの長さ、 位置合わせの要件、および相対位置によって決まります。 各レベルおよび構造体全体でこれらの要件を決定するプロセスを、 構造体のマッピング といいます。

レコード単位の入出力を使用するとき、ある構造体にどのくらいの長さのレコードが必要であるかを判別します。 また、位置指定モードの入出力では、構造体の位置合わせを正しく行うために必要な埋め込みまたは再配置の量を 判別します。このような場合、構造体のマッピングを通して判別することができます。

構造体のマッピングのプロセスは、構造体のメンバー相互間に生じる使用されない ストレージ (埋め込み) の量を最小にします。 これは、以下に説明する規則に (事実上) 従ってこの処理全体を完了させてから、構造体にストレージを割り振ります。

構造体のマッピングは、物理的な処理ではありません。 「シフトする」や「相対位置変更する」などの用語は、 単に説明の便宜で使用するもので、 実際にストレージ内で移動が行われるわけではありません。 構造体にストレージが割り振られるとき、マッピング処理の結果として相対位置が すでに知られています。

構造体全体のマッピングでは、項目 (エレメントまたはすでに個々のマッピングが判別されている小構造体) が順に対として組み合わされていきます。 1 つの対が作られると、それは 1 つの単位となり、別の単位と組み合わされます。構造体全体のマッピングが終わるまで、この操作が続けられます。 したがって、このプロセスの規則は、次の 2 種類に分類されます。

以下にこれらの規則を説明し、これらの規則の適用例を示して詳しく説明します。 構造体エレメントの論理レベルレベル番号 の違いを理解する必要があります。 構造体の宣言が一定のレベル番号で行われたり適切な字下げをして 行われていれば (規則の説明のあとに詳しい例示があります)、 論理レベルについてはすぐに明らかになります。 いずれにしても、構造体宣言の始まりから順番に各項目に下記の規則を 適用していけば、その構造体の各項目の論理レベルを判別することができます。

注:
ある項目の論理レベルは、その項目を直接に含んでいる構造体の 論理レベルよりも、常に 1 単位だけ低くなるという規則です。

次の例では、下の行の数字は、宣言内の各項目の論理レベルを示しています。

  dcl 1 A, 4 B, 5 C, 5 D, 3 E, 8 F, 7 G;

      1    2    3    3    2    3    3

対を作る順序の規則

対を作る順序を決める際の手順は、次のとおりです。

  1. 最も低い論理レベル (論理レベル n と呼ぶことにする) にある小構造体を見つけます。
  2. 論理レベル n の小構造体が複数あるときは、宣言内で最初に書いたものをとります。
  3. この小構造体内の最初の 2 つのエレメントを対にして、1 つの単位を形成します。 このとき、1 つの対をマッピングするための規則を使用します (1 つの対のマッピングを行うための規則を参照)。
  4. この単位と、この小構造体で宣言されている次のエレメント (ある場合) とを対にして、より大きい単位を形成します。
  5. この小構造体の全エレメントが 1 つの単位に組み合わされるまで、ステップ 4 を繰り返します。 これで、この小構造体のマッピングは完了です。 あらゆる埋め込みを含め、その位置合わせの要求と長さが決定され、 構造体宣言を変更しなければ変更されません。 ダブルワード境界からのオフセットも、ここで決められます。 このオフセットは、含まれている構造体をマッピングするときに有効です。 また、このようなマッピングの結果として変わることがあります。
  6. 宣言内の論理レベル n にある次の小構造体 (ある場合) について、 ステップ 3 からステップ 5 を繰り返します。
  7. 論理レベル n のすべての小構造体のマッピングが終わるまで、 ステップ 6 を繰り返します。 これらの小構造体のおのおのは、構造体のマッピングを行う上で 1 つのエレメントと考えることができます。
  8. 次の高い論理レベルで小構造体のためにペア化処理を繰り返します。 すなわち n を (n-1) に等しくし、ステップ 2 から 7 まで繰り返します。
  9. n = 1 までステップ 8 を繰り返します。 その後ステップ 3 から 5 を大構造体について繰り返します。

1 つの対のマッピングを行うための規則

ここでは説明の便宜上、ストレージをいくつかの連続したダブルワードと考えます。 各ダブルワードは 8 バイトで、0 から 7 までの番号が付いているものとし、 この番号でダブルワード境界からのオフセットを表します。 さらに、構造体の始まりからの長さやオフセットを算出できるように、 各バイトには、任意のバイトから始めて 0 から順に連続した番号が 付いているものとします。

  1. ダブルワード境界の対の最初のエレメントを開始するか、またはエレメントがすでにマップされている小構造体の場合は、示された量によってダブルワード境界からその分を 相対位置変更します。
  2. この 1 対の 2 番目のエレメントを、最初のエレメントの終わりの後に続く最初の有効な位置から始まるように合わせます。 この位置は、2 番目のエレメントの位置合わせ要件に左右されます。 (2 番目のエレメントが小構造体である場合、 その位置合わせ要件はすでに決定されています。)
  3. 最初のエレメントの位置合わせ要件が満たされる限り、最初のエレメントを 2 番目のエレメントの方向にシフトします。 どれだけシフトしたかによって、この 1 対がダブルワード境界からどれだけ離れているか (オフセット) が決まります。

この作業が完了すると、 この 2 つのエレメントの間の埋め込みは最少量になっており、 後続の作業中に変わることはありません。 対は固定長の単位および位置合わせ要件となります。その長さは 2 つの長さの合計と埋め込みであり、その位置合わせ要件は 2 つの位置合わせ要件の高い方 (それらが異なる場合) です。

UNALIGNED 属性による影響

以下に示す構造体のマッピングの例は、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 がマッピングされ、NSCM がこの順序でマッピングされます。

それぞれの小構造体ごとに、プロセスのステップを表 図 10 に示し、 そのプロセスを視覚的に捕えた図を 図 11 に示します。 最後に、図 17 に示すように、大構造体 A がマッピングされます。

 

この例の終わりには、各メンバーが A の始まりからどのくらい 離れているか (オフセット) を示す表の形で、 A の構造体マップを示します (図 18)。

図 10. 構造体のマッピング例
構造体のマッピング例
図 11. 小構造体 G のマッピング
小構造体 G のマッピング
図 12. 小構造体 E のマッピング
小構造体 E のマッピング
図 13. 小構造体 N のマッピング
小構造体 N のマッピング
図 14. 小構造体 S のマッピング
小構造体 S のマッピング
図 15. 小構造体 C のマッピング
小構造体 C のマッピング
図 16. 小構造体 M のマッピング
小構造体 M のマッピング
図 17. 大構造体 A のマッピング
大構造体 A のマッピング
図 18. 構造 A の最終的なマッピングにおけるオフセット
構造 A の最終的なマッピングにおけるオフセット

Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)