自動記憶域

自動変数の記憶域は、変数が宣言されているプロシージャまたは BEGIN ブロックが有効化されるたびに割り当てられます。記憶域は、そのブロックの有効化を表すスタック フレーム内で割り当てられます。ブロックが再帰的に有効化される場合は、そのブロックで宣言されたすべての自動変数のインスタンスが各スタック フレームにそれぞれ格納されます。

ブロックの有効化が終了すると、対応するスタック フレームがスタックから取り出され、そのスタック フレーム内で割り当てられているすべての自動変数の記憶域が解放されます。これは、通常はプロシージャから呼び出し元に戻ったときと BEGIN ブロックで END 文を実行したときに発生しますが、GOTO 文で前のブロックの有効化に制御を戻したときにも発生します。その場合、制御の移行先と GOTO の実行元の間のすべてのブロックの有効化が終了します。該当するスタック フレームがスタックから取り出され、それらのすべての自動変数の記憶域が解放されます。自動変数の宣言で INITIAL 属性を指定すると、変数を初期化することができます。

自動の文字列変数および配列変数の範囲は、整数値の式として指定できます。ただし、同じブロックで宣言された静的でない変数への参照を含めることはできません。これらの自動変数の範囲の式は、その変数を含むブロックが有効化されるたびに評価されます。範囲の式の値はスタック フレームに保存され、そのブロックの有効化において自動変数のサイズが実質的に固定されます。範囲として使用される変数への以降の代入は、関連する自動変数のサイズには影響しません。次に例を示します。

DECLARE STRING_SIZE FIXED;
   .
   .
   .
COPY: BEGIN;
DECLARE TEXT CHARACTER(STRING_SIZE);

この例の BEGIN ブロックが有効化されると、TEXT の範囲が評価されます。変数の記憶域は STRING_SIZE の値に応じて割り当てられます。この値は有効な整数値でなければなりません。次に例を示します。

DECLARE A(N) FIXED;
   .
   .
   .
N = 10; /* WILL NOT AFFECT THE SIZE OF ARRAY A */

この例では、包含するブロックの開始時に N が評価され、その値がスタック フレームに格納されて A のサイズが決まります。N への代入によって A のサイズが変更されることはありません。ブロックの開始時点で、N が正しい値になっている必要があり、このブロックで宣言された静的でない変数であってはなりません。このブロックの有効化で HBOUND 組み込み関数を使用した場合、スタック フレームに保存されている N の元の値が返されます。