OVERLAY(名前 {: 開始位置 | *NEXT })
OVERLAY キーワードは、1 つのサブフィールドの記憶域を別の記憶域によってオーバーレイするか、
または、固定形式定義では、データ構造自体の記憶域によってオーバーレイします。
このキーワードを使用することができるのは、データ構造サブフィールドの場合
だけです。
名前パラメーターで指定された記憶域が、開始位置パラメーターで指定された位置で、
「名前」記入項目のサブフィールドによってオーバーレイされます。開始位置が
指定されていない場合、1 にデフォルト設定されます。
注: サブフィールドのタイプに関係なく、開始位置パラメーターはバイト
単位です。
OVERLAY(名前:*NEXT) を指定すると、サブフィールドを、オーバーレイされたフィールド 内の次に使用可能な位置に置きます。 (これは、このサブフィールドより前にあり、同じサブフィールドをオーバーレイ する他のすべてのサブフィールドを過ぎた後の、最初のバイトです。)
キーワード OVERLAY には次の規則が適用されます。
名前パラメーターは、現行データ構造内の前に定義済みのサブフィールドの名前か、
または、固定形式定義では現行データ構造の名前でなければなりません。
自由形式定義では、POS キーワードを
使用して、データ構造内のサブフィールドの位置を指定します。
- データ構造が修飾されている場合は、OVERLAY
キーワードに対する最初のパラメーターは、データ構造名を修飾せずに指定する必要があります。
以下の例では、サブフィールド MsgInfo.MsgPrefix がサブフィールド
MsgInfo.MsgId をオーバーレイします。
D MsgInfo DS QUALIFIED D MsgId 7 D MsgPrefix 3 OVERLAY(MsgId) - 開始位置パラメーターは (指定される場合は)、小数点以下の桁を持たない 0 より大きい 値でなければなりません。これは、数値リテラル、数値を戻す組み込み関数、または数値定数とすること ができます。開始位置が名前付き定数の場合、この指定の前にその定数が定義されている必要があります。
- OVERLAY キーワードは「開始位置」記入項目がブランクでない時には使用す ることができません。
- 名前パラメーターがサブフィールドである場合、定義中のサブフィールドは、 名前パラメーターによって指定されたサブフィールドの中に完全に含まれていなければなりません。
- OVERLAY キーワードを使用して定義したサブフィールドの位置合わせは、手操 作で行なわなければなりません。 正しく位置合わせされなかった場合には、警告メッセージが出されます。
- OVERLAY キーワードの最初のパラメーターとして指定されたサブフィールド
が配列の場合には、OVERLAY キーワードは配列の各要素に適用されます。 すなわち、定義中のフィールドは同じ要素数を持つ配列として定義されます。 この配列の最初の要素は
オーバーレイされる配列の最初の要素にオーバーレイし、この
配列の 2 番目の要素はオーバーレイされる配列の 2 番目の要素にオーバーレイ
し、以下同様となります。 この状況では、OVERLAY キーワードを持つサブフィールドに配列キーワードを指
定することはできません。(図 1 を参照
してください) SORTA (配列の分類)も参照してください。
OVERLAY キーワードの最初のパラメーターとして指定されたサブフィールド名が 配列で、その要素の長さが定義中のサブフィールドの長さより長い場合には、定 義中のサブフィールドの配列要素は連続して記憶されません。 このような配列は、PARM 命令の結果のフィールドとして、または MOVEA 命令の 演算項目 2 または結果のフィールドの中では使用することができません。
- データ構造に ALIGN キーワードを指定する と、OVERLAY(名前:*NEXT) を指定して定義されたサブフィールド は、その任意の位置に位置合わせされます。 ポインター・サブフィールドは、常に 16 バイト境界に位置合わせされます。
- オーバーレイしているサブフィールド
をもつサブフィールドが定義されていない場合、そのサブフィールド
は次のように暗黙的に定義されます。
- 開始位置は、データ構造内で最初に使用可能な位置です。
- 長さは、オーバーレイしているサブフィールドをすべて含むことが できる最低の長さです。 そのサブフィールドが配列として定義されている 場合、オーバーレイしているサブフィールドがすべて適切に位置合わせされる ように、長さが延長されます。
例
図 1. キーワード DIM および OVERLAY を持つサブフィールドの記憶域割り振り
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++++++++++
D DataStruct DS
D A 10 DIM(5)
D B 5 OVERLAY(A)
D C 5 OVERLAY(A:6)
記憶域でのフィールドの割り振り:
| A(1) | A(2) | A(3) | A(4) | A(5) | |||||
| B(1) | C(1) | B(2) | C(2) | B(3) | C(3) | B(4) | C(4) | B(5) | C(5) |
図 2. キーワード DIM および OVERLAY を持つサブフィールドの記憶域割り振り
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
D DataStruct DS
D A 5
D B 1 OVERLAY(A) DIM(4)
記憶域でのフィールドの割り振り:
| A | ||||
| B(1) | B(2) | B(3) | B(4) | |
次の例は、サブフィールドのオーバーレイ位置を定義するための等価の方法を 2 つ示しています。
1 つは (名前:開始位置) を使用して明示的に行う方法で、もう 1 つは (名前:*NEXT) を使用して暗黙的に行う方法です。
図 3. NEXT を使用したサブフィールド・オーバーレイ位置の定義
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
* Define subfield overlay positions explicitly
D DataStruct DS
D PartNumber 10A
D Family 3A OVERLAY(PartNumber)
D Sequence 6A OVERLAY(PartNumber:4)
D Language 1A OVERLAY(PartNumber:10)
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
* Define subfield overlay positions with *NEXT
D DataStruct DS
D PartNumber
D Family 3A OVERLAY(PartNumber)
D Sequence 6A OVERLAY(PartNumber:*NEXT)
D Language 1A OVERLAY(PartNumber:*NEXT)