基底付き変数の宣言は世代 (すなわち必要なストレージの量と その属性) の宣言です。 (基底付き変数は、主記憶域での世代の位置を示しません。) 世代の位置は、 ロケーター変数で示します。 割り振られていない基底付き変数の値を参照すると、エラーになります。
|
基底付き変数を参照するとき、データ属性と位置合わせ属性についてはその基底付き変数の属性が使用されますが、データの位置は、その変数を修飾しているロケーター変数が示します。
基底付き変数に EXTERNAL 属性を付けることはできませんが、基底付き変数の ロケーター参照には、基底付きストレージ・クラスを含む任意のストレージ・クラスを付けるこ とができます。
REFER オプションを使用すれば、調整可能な区域サイズ、配列の境界、およびストリング の長さの指定を持つ基底付き構造体もしくは共用体を宣言することができま す。 REFER オプション (自己定義データ)を参照してください。基底付きの VARYING ストリングや VARYINGZ ストリングの最大長は、それらのストリングがオーバーレイするストリングの最大長に等しくなければなりません。 以下に例を示します。
declare A char(50) varying based(Q),
B char(50) varying;
Q=addr(B);基底付き VARYING ストリングは、VARYING ストリング上にのみオーバーレイする ことができ、基底付き VARYINGZ ストリングは、VARYINGZ ストリング上にのみ オーバーレイすることができます。
基底付き変数用のストレージは、ALLOCATE ステートメント、ALLOCATE 組み込み関数、 AUTOMATIC 組み込み関数、または LOCATE ステートメントを使用して割り振る ことができます。 基底付き変数は、(SET オプションを指定した) READ ステートメント、FETCH ステ ートメント、または ADDR 組み込み関数を使用することによって、既存のデータを アクセスするときにも使用できます。
基底付き AREA 変数は、ALLOCATE ステートメントを使用して割り振ることが できます。PL/I は割り振りを行うときに自動的に区域を EMPTY に初期設定します。 ただし、ALLOCATE または AUTOMATIC 組み込み関数を使用して区域変数にストレージを獲得すると、ストレージを獲得したあとでその変数に EMPTY を割り当てる必要があります。
割り振られた世代の位置はロケーター変数で示されるので、適切なロケーター 値を使用すれば、プログラム内の任意の場所で基底付き変数のどの世代でも参 照することができます。 次の例では、参照が明示的に修飾されているときを除いて、X を参 照するときにはロケーター変数 P によって X の記憶場所 が示されることを宣言しています。
dcl X fixed bin based(P);
このようにしてロケーター参照に関連付けても、その関連付けは永続的なものではありません。 このロケーター参照を使用して別の基底付き変数の位置を示すこともできます し、別のロケーター参照を使用して変数 X の別の世代を示すことも できます。 ロケーター参照を指定せずに基底付き変数を宣言した場合は、その基底付き変 数を参照するときには必ず、ロケーターを使って明示的に修飾する必要があり ます。
次の例では、配列 A と配列 C は同じストレージを指します。 エレメント B とエレメント C(2,1) も同じストレージを指します。
dcl A(3,2) character(5) based(P),
B char(5) based(Q),
C(3,2) character(5);
P = addr(C);
Q = addr(A(2,1));
DEFINED 属性および UNION 属性のいずれを使用しても変数をストレージにオーバーレイすることができますが、DEFINED および UNION によるオーバーレイは永続的な ものとなります。 ロケーター参照によって基底付き変数をオーバーレイしたときは、ロケーター 変数に新しい値を割り当てれば、プログラムの実行中いつでも、その結びつき を変更できます。
DEFINED 属性および UNION 属性の詳細については、DEFINED 属性と POSITION 属性および 共用体を参照してください。
基底付き変数に INITIAL 属性を指定してもかまいません。 初期値が割り当てられるのは、ALLOCATE または LOCATE ステートメントに よって基底付き変数が明示的に割り振られたときだけです。