REALLOC (新しい長さでの記憶域の再割り振り)

自由形式構文 (許可されていない - %REALLOC 組み込み関数を使用)
コード 演算項目 1 演算項目 2 結果フィールド 標識
REALLOC (E)   長さ ポインター _ ER _

REALLOC 命令は、結果フィールド・ポインターによって指し示されている 動的記憶域の長さを、演算項目 2 に指定された長さに変更します。REALLOC の 結果フィールドには基底ポインター変数が入っています。 結果フィールド・ポインター には、動的記憶域割り振り命令 (RPG 内の ALLOC また は REALLOC 命令、あるいは CEEGTST などの他の何らかの動的記憶域機能) によって 直前に設定された値が入っていなければなりません。 このポインターは、動的記憶域を単純に指し示すだけのものでは ありません。割り振りの始めに設定されていることも必要です。

指定されたサイズの新しい記憶域が割り振られ、古い記憶域の 値は、新しい記憶域にコピーされます。 古い記憶域は割り振り解除されます。新しい長さが短い場合、値の右辺が切り捨てられます。 新しい長さが長い場合には、新しい記憶域のうち、コピーされたデータから 右側は初期化されません。

結果フィールド・ポインターは、新しい記憶域を指し示すように 設定されます。

この命令が正常に行われないと、エラー条件が発生しますが、 結果フィールド・ポインターは変更されません。元のポインターが有効であり、 使用可能な新しい記憶域が不十分であるために (状況 425) 命令が失敗した場合は、 元の記憶域は割り振り解除されず、そのため、 結果フィールド・ポインターはその元の値のまま、引き続き有効になります。

ポインターが有効でも、割り振り解除できる記憶域を指し示していない 場合、426 (記憶域管理命令内のエラー) が設定されます。

プログラム状況コードが 425 または 426 である 例外を処理するために、命令コード拡張 'E' またはエラー標識 ER を指定できますが、 両方を指定することはできません。 エラー処理の詳細については、プログラム例外/エラーを 参照してください。

演算項目 2 には、割り振られる新しいサイズの記憶域 (バイト単位) を 示す数値変数または定数が入ります。 演算項目 2 は小数点以下の桁がない数値でなければなりません。 値は、1 から最大許容サイズまでの範囲でなければなりません。

最大許容サイズは、制御仕様書の ALLOC キーワードによる、 メモリー管理命令に使用されるヒープ記憶域のタイプによって異なります。 モジュールがメモリー管理命令にテラスペース記憶域モデルを使用することがコンパイル時に分かっている場合、 許容最大サイズは 4294967295 バイトです。 それ以外の場合、最大許容サイズは 16776704 バイトです。

実行時に使用可能な最大サイズは、RPG の許容最大サイズより小さい場合があります。

モジュールの RPG メモリー管理命令が、制御仕様書の ALLOC キーワードにより、単一レベル・ヒープ記憶域を使用している場合、 REALLOC 命令は、単一レベル・ヒープ記憶域へのポインターのみを処理できます。 モジュールの RPG メモリー管理命令が、テラスペース・ヒープ記憶域を使用している場合、 REALLOC 命令は、単一レベルとテラスペースの両方のヒープ記憶域へのポインターを処理できます。

詳細については、メモリー管理命令を参照してください。

図 1. REALLOC 命令
 D Ptr1            S               *
 D Fld             S          32767A     BASED(Ptr1)
  * ALLOC 命令は 7 バイトをポインター Ptr1 に割り振ります。
  * ALLOC 命令後は、可変
  * Fld の最初の 7 バイトだけが使用可能です。
 C                   ALLOC     7                 Ptr1
 C                   EVAL      %SUBST(Fld : 1 : 7) = '1234567'
 C                   REALLOC   10                Ptr1
  * 現在 10 バイトの Fld が使用可能です。
 C                   EVAL      %SUBST(Fld : 1 : 10) = '123456789A'