領域データ

領域は、基底付き変数の割り当ておよび解放ができる、記憶域のリージョンです。領域変数には任意のストレージ クラスを指定でき、スカラー変数にすることも配列変数にすることもできます。AREA 属性を使用した明示的な宣言の形式は次のとおりです。

AREA[(exp [REFER (variable)])]

または

AREA (*)

AREA 属性とともに使用する exp では、その領域に予約するバイト数を指定します。このサイズは、必要に応じて 8 バイト境界に切り上げられます。

領域のストレージ クラスが STATIC の場合、サイズは整数定数でなければなりません。

領域のストレージ クラスが AUTOMATIC、CONTROLLED、または BASED の場合は、整数式でサイズを定義します。ただし、領域が BASED 構造体のメンバーである場合は、サイズ指定で REFER オプションを使用できます。

式もアスタリスクも指定しない場合のデフォルトのサイズは 1000 バイトです。次に例を示します。

DECLARE AREA1   AREA(4096), 
   AREA2        AREA,
   1 S       BASED,
   2 X       FIXED BIN(15),
   2 AREA3(1024 REFER(X));

AREA は、次のようなコンテキストで暗黙的に宣言することもできます。

領域変数は常に 8 バイト境界で整列されます。UNALIGNED 属性は AREA 変数には適用できません。

領域に割り当てることができるのは基底付き変数だけです。領域を使用すると、関連する項目の割り当ておよび解放を、その領域に予約された記憶域のリージョンのみで行うことができます。領域は、そこに含まれるすべての割り当てを伴う 1 つの単位として割り当てたり送信したりできます。必要な整列制約を保持するために、領域内の割り当てのサイズは常に 8 バイト境界に切り上げられます。

予約された記憶域のうち実際に使用されている量を、領域の「範囲」と呼びます。領域が最初に割り当てられた時点 (領域内で割り当てが行われる前) の範囲はゼロです。最大範囲は「領域のサイズ」です。基底付き変数の割り当てや解放が行われると、記憶域の使用量の変化を反映して領域の範囲が更新されます。さらに、基底付き変数が解放されると、その変数が占有していた記憶域が、領域内の使用可能な記憶域ブロックのチェーンに追加されます。領域の範囲およびフリー チェーンは、その領域に予約されたスペースに隣接する 8 バイトの制御ブロックに保持されます。

領域では、代入および引数としての受け渡しは可能ですが、比較などの演算子は適用できません。

領域変数を別の領域変数に代入すると、ターゲット領域のすべての割り当てが解放され、ターゲット領域の範囲がソース領域と同じに設定されます。

AREA 条件は、実行時に無効な領域割り当てが検出されると発生します。この状況は、ソース領域の最大サイズがターゲット領域の最大サイズを超えている場合に発生します。AREA 条件はまた、格納用の空き記憶域が不足している領域内で基底付き変数を割り当てようとしたときにも発生します。AREA 条件の詳細については、「Statements」ヘルプ セクションにある「ON」トピックの AREA に関する説明を参照してください。

オフセット変数は、領域内の基底付き変数の位置を示すために使用されます。詳細については、「データ型」ヘルプ セクションの「オフセット データ」のトピックを参照してください。

AREA 型の変数は、内容が複雑で、サイズが大きくなる可能性があるため、<...> と表示されます。