区域変数は、基底付き変数を割り振るために予約される主記憶域の区域を 定義するものです。 ALLOCATE ステートメントや FREE ステートメントを使用すれば、この 予約されたストレージを基底付き変数に割り振ったり、基底付き変数から 解放したりすることができます。 区域変数のストレージ・クラスはどれでもかまいませんが、区域変数に ALIGNED を指定しなければなりません。
基底付き変数を割り振るときに区域の指定を省略すると、使用可能な どこかのストレージが取得されます。 したがって、割り振られた複数の基底付き変数が主記憶域全体にわたって分散していることもあります。 内部処理の場合は、項目はポインターの使用によって容易にアクセス されるので、分散していても支障はありません。 しかし、割り振られた項目をデータ・セットに伝送する場合は、それらを 1 つにまとめる 必要があります。 区域変数に割り振られた項目はすでに 1 つにまとまっているので、1 つの 単位として伝送や割り当てを行うことができ、しかもそれらを個別に処理することもできます。
ある区域変数内での基底付き変数の位置は、その区域変数の開始位置からの変位として識別できると便利です。 この目的のためにオフセット変数が用意されています。
区域はその含まれる割り振りで、完全に割り当てまたは伝送することができます。そのため、基底付き割り振りのセットは、割り当てと入出力のための単位として扱うことができ、各割り振りは独自の識別を保持します。
区域のサイズは、ストリングの長さや配列の境界と同じ方法で調節できるので、式 やアスタリスク (被制御区域パラメーターの場合)、または REFER オプション (基底付き区 域の場合) を使用して指定することができます。
OFFSET 属性または IN オプション内に書いた変数には、コンテキスト上から、 AREA 属性が与えられます。変数の AREA 属性を明示的に宣言することも できます。
|
ストレージ・クラスが AUTOMATIC または CONTROLLED である区域のサイズは、予約され るストレージのバイト数を表す値になる式で指定します。
区域が BASED 属性を持っているときは、区域のサイズは定数で指定しなければな りません。ただし、その区域が基底付き構造体または共用体のメンバーで、しか も REFER オプションを使用する場合は例外です。
静的ストレージ・クラスの区域サイズは、制限付き式で指定しなければなりません。
AREA 属性を宣言する例を次に示します。
declare area1 area(2000),
area2 area;
宣言されたサイズの区域が予約され、その予約された区域の前にさらに 16 バイトが付けられます。 この 16 バイトには、使用中のストレージの大きさなどの制御情報の詳細が入ります。
実際に使用される予約済みのストレージの大きさは、区域のエクステント といいます。 区域変数が割り振られた時点では、そこにはなにも入っていないので、区域のエクステントはゼロです。 最大エクステントはその区域のサイズです。 実行中いつでも、区域内で基底付き変数を割り振ることも解放することもできます。したがって、区域のエクステントは変化します。
基底付き変数が解放されると、その変数が占有していたストレージは別の割り振りに使用可能になります。 ある区域内の使用可能なストレージのチェーンは保持されます。チェーンの 先頭は制御情報内に保持されます。 基底付き変数に必要なストレージの容量はそれぞれ異なっているので、それらを割り振ったり解放したりすれば、割り振りの容量と使用可能なスペースの容量が一致しないときには必然的にすき間が生じます。 これらのすき間は区域のエクステントに含まれます。
どのような演算子 (比較演算子を含む) も、区域変数に使用することはできません。