パラメーターは、PROCEDURE または ENTRY ステートメント内に指定したパラメーター属性でコンテキストにもとづいて宣言されます。 パラメーターは、適切な属性を使用して明示的に宣言されなければなりません。 パラメーター属性は宣言内に指定することもできます。 属性が DECLARE ステートメント内に指定されていない場合には、 デフォルトの属性が適用されます。 パラメーター名は、添え字を付けたり、修飾することはできません。
|
表 8 と以下では、パラメーターに対して宣言できる属性を説明します。
パラメーターには、常に INTERNAL 属性があります。
パラメーターが構造体または共用体である場合には、レベル 1 の 名前が指定されなければなりません。
パラメーターは、CONTROLLED ストレージ・クラス属性しか持つことができません。 被制御パラメーターは、被制御引数を持つ必要があり、 INITIAL 属性も持つことができます。
レコード単位の入出力で使用されるパラメーターまたは DEFINED 項目の基本変数としてのパラメーターは、連結ストレージ内になければなりません。 CONNECTED 属性は、プロシージャー内の宣言、 およびプロシージャー入り口宣言の記述子リスト内の両方で 指定されなければなりません。
単純パラメーターの境界、長さ、およびサイズは、 アスタリスクまたは制限付き式のいずれかによって指定されなければなりません。 実際の長さ、境界、またはサイズが起動のたびに異なるときには、 それぞれをアスタリスクで DECLARE ステートメントに指定できます。 アスタリスクが使用されている場合は、関連した引数の現行世代から長さ、 境界、またはサイズが取得されます。
関連した引数が仮引数である場合、 集合体のエレメントであるストリングの長さ指定として アスタリスクを使用することはできません。 ストリングの長さは整数として指定する必要があります。
被制御パラメーターの境界、長さ、またはサイズは、 アスタリスクや要素式を使用して DECLARE ステートメントに 指定することができます。
アスタリスクを使用するとき、被制御パラメーターの長さ、境界、 またはサイズは、関連した引数の現行世代から取得されます。 異なる長さ、境界、またはサイズを ALLOCATE ステートメントに指定しないか ぎり、以後の被制御パラメーターの割り振りは、同じ境界、長さ、または サイズを使用して行われます。 引数の現行世代が存在しない場合、アスタリスクはパラメーターの 次元数だけを決定します。そのパラメーターに対してその他の参照を行うには、 呼び込まれたプロシージャーの ALLOCATE ステートメント によって、事前に被制御パラメーターの境界、長さ、またはサイズが 指定されている必要があります。
パラメーターが割り振られるたびに、式が計算されて、 新しい割り振りの現行境界、長さ、またはサイズを指定します。 ただし、その DECLARE ステートメントの式は、 ALLOCATE ステートメント自体の境界、長さ、またはサイズの 指定によって指定変更されます。
図 4 では、Sub1 が呼び出されると、 割り振られる A および B が渡されます。
%process or('|') num margins(1,72);
Package:package exports(*);
Main: procedure options(main);
declare (A(NA), B(NB), C(NC), D(ND) ) controlled;
declare (NA init(20), NB init(30), NC init(100),
ND init(100) ) fixed bin(31);
declare Sub1 entry((*) controlled, (*) controlled);
declare Sub2 entry ((*) ctl, (*) ctl, fixed bin);
allocate A,B; /* A(20), B(30) */
display ('Gen1: DIM(A)=' || dim(A) || ', ' || "DIM(B)=" || dim(B));
call Sub1(A,B);
display ('Gen2: Allocn(A)=' || allocn(a) || ', ' ||
'Allocn(B)=' || allocn(B) );
display ('Gen2: DIM(A)=' || dim(A) || ', ' || "DIM(B)=" || dim(B));
free A,B;
display ('Gen1: Allocn(A)=' || allocn(A) || ', ' ||
'Allocn(B)=' || allocn(B) );
display ('Gen1: DIM(A)=' || dim(A) || ', ' || "DIM(B)=" || dim(B));
free A,B;
display ('Gen0: Allocn(A)=' || allocn(A) || ', ' ||
'Allocn(B)=' || allocn(B) );
call Sub2 (C,D,10);
display ('Gen1: Allocn(C)=' || allocn(C) || ', ' ||
'Allocn(D)=' || allocn(D) );
display ('Gen1: DIM(C)=' || dim(C) || ', ' || "DIM(D)=" || dim(D));
free C,D;
display ('Gen0: Allocn(C)=' || allocn(c) || ', ' ||
'Allocn(D)=' || allocn(D) );
end Main;
Sub1: procedure (U,V);
dcl (U(UB), V(*)) controlled,
UB fixed bin(31);
display ('Gen1: Allocn(U)=' || allocn(U) || ', ' ||
'Allocn(V)=' || allocn(V) );
display ('Gen1: DIM(U)=' || dim(U) || ', ' || "DIM(V)=" || dim(V));
UB=200;
allocate U,V; /* U(200), V(30) */
display ('Gen2: Allocn(U)=' || allocn(U) || ', ' ||
'Allocn(V)=' || allocn(V) );
display ('Gen2: DIM(U)=' || dim(U) || ', ' || "DIM(V)=" || dim(V));
end Sub1;
Sub2: procedure (X,Y,N);
dcl (X(N),Y(N)) controlled,
N fixed bin;
display ('Gen0: Allocn(X)=' || allocn(X) || ', ' ||
'Allocn(Y)=' || allocn(Y) );
allocate X,Y; /* X(10), Y(10) */
display ('Gen1: Allocn(X)=' || allocn(X) || ', ' ||
'Allocn(Y)=' || allocn(Y) );
display ('Gen1: DIM(X)=' || dim(X) || ', ' || "DIM(Y)=" || dim(Y));
end Sub2;
end Package;Sub1 内の ALLOCATE ステートメントは、 A と B の 2 番目の世代を割り振ります。 B は両方の世代に同じ境界を持ち、A は 2 番目の世代には 異なる境界を持ちます。
Main へ戻る際、最初の FREE ステートメントは (Sub1 で 割り振られている) A と B の 2 番目の世代を解放します。 2 番目の FREE ステートメントは、(Main で 割り振られている) A と B の最初の世代を解放します。
Sub2 では、X と Y は、N の値によって 異なる境界を使用して宣言されています。 X と Y が割り振られたら、それらの値を使用して、 割り振られた配列の境界を判別します。
Sub2 から Main へ戻る際、FREE ステートメントは、 (Sub2 で割り振られている) C と D の 世代のみを解放します。