ALLOCATE var_ref [IN (area_ref)] [SET(loc_ref)] [, var_ref [IN ( area_ref)] [SET( loc_ref)]]...
CONTROLLED 変数については次のようになります。
ALLOCATE based-or-controlled-alloc[, based-or-controlled-alloc]...;
based-or-controlled-alloc は次のとおりです。
dimension-attribute は、dimension-attribute を指定して宣言された変数に対してのみ指定できます。指定する場合は、宣言と同じ次元数を指定する必要があります。
CHARACTER、BIT、および AREA の各属性は、それらの属性を指定して宣言された変数に対してのみ指定できます。
BASED 変数および CONTROLLED 変数の詳細と ALLOCATE 文での使用方法については、「ストレージ クラス」の章の「基底付き変数」および「制御変数」のセクションを参照してください。
例 1
DECLARE 1 A_STRUCT BASED (A_PTR), 2 A_MEMBER FIXED BIN(15); DECLARE (A_PTR, B_PTR, C_PTR) POINTER; DECLARE 1 B_STRUCT BASED (B_PTR), 2 B_MEMBER FIXED BIN(15); DECLARE 1 C_STRUCT BASED (C_PTR); 2 C_MEMBER FLOAT BIN(23); DECLARE (P,Q) POINTER; ALLOCATE A_STRUCT; A_STRUCT.A_MEMBER = 5; ALLOCATE B_STRUCT SET (P), C_STRUCT SET(Q);
上記の例の A_STRUCT の割り当てでは、SET オプションが指定されておらず、A_STRUCT が A PTR を基底として宣言されているため、割り当てられたアドレスは A_PTR に格納されます。B_STRUCT の割り当てでは、割り当てられたアドレスを P に割り当てるように SET オプションで指定しています。B_STRUCT および C_STRUCT を割り当てる際は、SET オプションの指定に従って、割り当てられた記憶域のアドレスが P および Q にそれぞれ割り当てられます。
例 2
DECLARE (A, B) AREA; DECLARE A1 CHAR(20) BASED; DECLARE A2 CHAR(20) BASED(O2); DECLARE A3 CHAR(20) BASED(O3); DECLARE (O1, O2) OFFSET(A); DECLARE )3 OFFSET; DECLARE (P1, P3) POINTER; ALLOCATE A1 SET(P1); ALLOCATE A1 SET(O1); ALLOCATE A2; ALLOCATE A3 IN(B); P3 = POINTER(O3, B);
上記の例 2 で、A1 の最初の割り当ては、SET オプションのロケーター参照でポインター変数を指定しているため、領域内で行われません。A1 の 2 番目の割り当ては、SET オプションのロケーターで領域 A に関連付けられたオフセット変数を指定しているため、領域 A で行われます。A2 の割り当てについても、A2 は領域 A に関連付けられたオフセット変数 O2 を基底として宣言されているため、領域 A で行われます。A3 の割り当ては、IN オプションの指定に従って領域 B で行われます (O3 の宣言に領域の関連付けがないため、A3 のアドレス指定には POINTER 組み込み関数を使用する必要があることに注意してください)。
説明:
ALLOCATE 文は、基底付き変数で記述された値に使用する記憶域ブロックを割り当てます。
SET オプションおよび IN オプションは、ALLOCATE 文では必須ではありません。使用する場合は任意の順序で指定できます。
SET オプションを var_ref とともに使用すると、割り当てられた記憶域のアドレスがその var_ref の指定された loc_ref に格納されます。SET オプションは制御変数を割り当てる場合は使用できません。
SET オプションを使用しない場合は、割り当てられたアドレスが基底付き変数の宣言で割り当てられたロケーター参照に格納されます。基底付き変数でロケーター参照が割り当てられていない場合はエラーが発生します。
IN オプションを使用するか SET オプションでオフセット変数を指定すると、領域内で割り当てが行われます。IN オプションを省略した場合に SET オプションでオフセット変数を指定する際は、その変数が宣言内で領域に関連付けられている必要があります。「宣言と属性」の章の「OFFSET」セクションの OFFSET 属性の説明を参照してください。