データ構造サブフィールドの定義

サブフィールドは、定義仕様書の「定義タイプ」記入項目 (24 から 25 桁目) にブラン クを指定することによって定義します。 サブフィールド定義 (複数も可) は、データ構造定義の直後に続いていなければ なりません。 サブフィールド定義は、ブランクでない定義タイプの指定を持つ定義仕様書が見付 かった時、あるいは別の仕様タイプが見付かった時に終わります。

サブフィールドの名前は 7 から 21 桁目に記入されます。 ソース仕様の読みやすさを向上させるために、サブフィールド名を字下げし、それら がサブフィールドであることを視覚的に表示することができます。

データ構造が QUALIFIED キーワードを指定して定義されている場合、サブフィールド名はユーザーのプログラムの中の他の名前と同じであっても構いません。 サブフィールド名は、使用される時点でそのサブフィールドを所有するデータ構造によって修飾されます。

また、LIKE キーワードを使用して、サブフィールドを既存の項目と類似のものと して定義することができます。このようにして定義された場合のサブフィールドの長さとデータ・タイプは、 その基礎になった項目と同じになります。 同様に、LIKEDS キーワードを使用して既存の項目と同じようにデータ構造全体を定義することができます。 LIKE キーワードの使用例については、図 117 を参照してくださ い。

キーワード LIKEDS はサブフィールド定義に指定できます。 指定される場合、 サブフィールドは、独自のサブフィールドのセットを持つデータ構造として定義されます。 データ構造 DS がサブフィールド S1 を持ち、このサブフィールドが サブフィールド S2 を持つデータ構造と同じに定義されている場合、プログラマーは式 DS.S1.S2 を使用して S2 を参照する必要が あります。

注:
  1. キーワード LIKEDS は QUALIFIED データ構造内でのみサブフィールドに使用できます。
  2. キーワード DIM および LIKEDS は両方とも同じサブフィールド定義で使用できます。

前に定義されたサブフィールドの記憶域は、OVERLAY キーワードを使用し、別の サブフィールドの記憶域でオーバーレイすることができます。 このキーワード は、後の方のサブフィールド定義に指定されます。 OVERLAY キーワードの使用例については、図 54 を参照してく ださい。

サブフィールドの長さの指定

サブフィールドの長さは、絶対 (位取り) 表記法、長さ表記法を使用して指定することができます。また、その長さを暗黙指定することもできます。

絶対
定義仕様書の「開始位置」(26 から 32 桁目) と「終了位置/長さ」(33 から 39 桁 目) の両方の記入項目に値を指定してください。
長さ
「終了位置/長さ」(33 から 39 桁目) の記入項目に値を指定して ください。 「開始位置」の記入項目はブランクです。
暗黙の長さ
サブフィールドが 1 つ以上の OVERLAY キーワードの 最初のパラメーターで指定される場合、このサブフィールドはタイプまたは長さの情報を 指定しないで定義することができます。 この場合、タイプは文字になり、長さはオーバーレイされるサブフィールドによって決まります。

また、ポインター、日付、時刻、およびタイム・スタンプなどのように、 固定長になっているデータ・タイプもあります。 これらのタイプでは、長さが暗黙指定されていますが、明示的に指定することもできます。

長さ表記法を使用している場合には、サブフィールドは、その開始位置が前に定 義されたすべてのサブフィールドの最大の終了位置より大きくなるように位取り されます。 各表記法の例については、データ構造の例を参照してください。

データ構造サブフィールドの位置合わせ

サブフィールドの位置合わせが必要な場合があります。 場合によっては、それが自動的に行われることがありますが、手操作で行わ なければならないこともあります。

たとえば、長さ表記法を使用し、基底ポインターまたはプロシージャー・ポイン ター・タイプのサブフィールドを定義している場合には、コンパイラーが必要に 応じて埋め込みを行うので、サブフィールドは確実に正しく位置合わせされます。

浮動、 整数、または符号なしサブフィールドを定義している場合には、 実行時のパフォーマンスを改善するために位置合わせが 必要になる場合があります。 長さ表記法を使用してサブフィールドを定義する場合には、 データ構造定義にキーワード ALIGN を 指定することによって、浮動、整数または符号なしサブフィールド を自動的に位置合わせすることができます。 ただし、以下の例外に注意してください。

自動位置合わせでは、フィールドが次の境界で位置合わせされることになります。

フィールドを手操作で位置合わせしている場合には、それらが同じ境界で位置合わせ されることを確認してください。 ((桁 - 1) mod n) = 0 の 場合には、開始位置は n バイト境界にあります。("x mod y" の値は、 整数算術で x を y で除算した余りです。これは、X DIV Y の後の MVR 値と同じです。)

図 50 は、一連のバイトを示し、位置合わせに使用される種々の 境界を表しています。

図 50. データ位置合わせの境界
REQTEXT

上のバイト順序については、次の点に注意してください。

ネストされたデータ構造の初期化

キーワード INZ(*LIKEDS) は LIKEDS サブフィールドで使用できます。LIKEDS サブフィールドは、対応するデータ構造と完全に同じ ように初期化されます。

キーワード INZ は LIKEDS サブフィールドで使用できます。 LIKEDS サブフィールドのネストされたすべてのサブフィールドは、デフォルト値に初期化されます。 これは、 さらに深くネストされた LIKEDS サブフィールドにも適用されますが、ネストされた LIKEDS サブフィールドで INZ(*LIKEDS) が指定されているものには 適用されません。

キーワード INZ が主なデータ構造定義でコーディングされている場合、キーワード INZ は明示的な初期化なしに、データ構造のすべてのサブフィールドに暗黙指定されます。これには、LIKEDS サブフィールドが含まれます。