CONTROLLED として宣言された変数は、ALLOCATE ステートメントで指定されたと きにだけ割り振られます。 被制御変数は、その変数を指定している FREE ステートメントに制御権が到達する か、またはプログラムが終了するまで、割り振られたままになっています。
被制御変数は、プログラムのブロック構造体から、部分的に独立しています (ただ し、完全に無関係というわけではありません)。 被制御変数の有効範囲は、INTERNAL または EXTERNAL のいずれでもかまいません。 INTERNAL と宣言されている場合の有効範囲は、その変数を宣言しているブロッ クと、そのブロックに含まれているブロックです。 まだ割り振られていない被制御変数を参照すると、エラーになります。
|
省略形: CTL
以下の例では、変数 X はプロシージャー B 内と、プ ロシージャー A の CALL ステートメントの実行に続く部分内で有 効に参照することができます。
A: proc; dcl X controlled; call B;
·
·
·
B: proc; allocate X;
·
·
·
end B; end A;
一般に、被制御変数が有用なのは、調整可能なエクステントを持つ大きなデータ集合がプログラムに必要なときです。 次の例のステートメントは、入力データに応じて必要なだけのストレージを割り振 り、不要になったときにそのストレージを解放します。
dcl A(M,N) ctl; get list(M,N); allocate A; get list(A);
·
·
·
free A;
この方法を採用すると、ブロックを活動化したり終了したりする必要がないので、開始ブロックを設ける方法よりも効率がよくなります。