データの初期化
EGL は、以下のようにデータの初期化を処理します。
- 以下の場合では、通常、イニシャライザー (等号の後にリテラルを続けたもの) をコード化することができます。
- 構造化レコード・パーツを定義する場合 (すべての最下位レベル・フィールド)。
Record ExampleRecord type basicRecord 10 myField CHAR(5); 20 myField01 CHAR(1) = "1"; 20 myField02 CHAR(1) = "2"; 20 myArray01 CHAR(1)[3] = ["a", "b", "c"]; // 以下のエントリーでは、最初の要素に "z" を割り当てます // そして、(Java コードでは) 残りはブランクです 20 myArray02 CHAR(1)[3] = ["z"]; endこの規則は、フォーム・フィールドにも適用されます。DataTable で、イニシャライザーを指定することはできません。
- プリミティブ・データ型に基づいて変数を宣言する場合。
Record ExampleRecord type basicRecord myRecField INT = 2; end Program myProgram (myField03 INT = 3) myField04 STRING = "EGL"; function main() // myRecord.myRecField = 2 myRecord ExampleRecord; end end - 他のレコードを再定義するレコードを宣言する場合 (イニシャライザーは、宣言した時点では効果はありませんが、コードが set
record initial 文を呼び出す場合に使用されます)。
Record partA 10 aa char(4) = "abcd"; end Record partB 10 bb char(4) = "1234"; end Program Example A partA; B partB { redefines="A" }; function main() // 次のそれぞれの文が "abcd" を書き込みます writeStdOut( A.aa ); writeStdOut( B.bb ); // メモリー領域を、レコード partB の定義を反映するように設定します set B initial; // 次のそれぞれの文が "1234" を書き込みます writeStdOut( A.aa ); writeStdOut( B.bb ); end end
- 構造化レコード・パーツを定義する場合 (すべての最下位レベル・フィールド)。
- EGL は、以下のような場合に、事前設定値 (後で説明) のあるメモリーも初期化します。
- ロジックで、set 文の一種が呼び出される。 setを参照してください。
- 変数の初期化済みプロパティーを YES に設定する。これは、レコード・フィールドのではなく変数のプロパティーであり、一般的には既に古いものとされています。
- ライブラリー、サービス、およびすべてのハンドラー・タイプなどの Java™ 用パーツを生成する。
構造化レコードでは、最下位の構造化フィールドのみが初期化されます。 以下の例を考えてください。
hexField のメモリー領域は、HEX 変数に適した 2 進ゼロで初期化されます。 remainder フィールドは、ブランクで初期化されます。 HEX 文字 2 つで 1 バイトになるため、HEX(16) 変数が使用するのは 8 バイトのみです。Record ExampleRecord 10 charField CHAR(24); 15 hexField HEX(16); 15 remainder CHAR(16); end配列の場合、配列の各メンバーが個別に初期化されます。
プログラムまたは関数引数として受け取られたレコードまたはフィールドが、 自動的に初期化されることはありません。
NULL 可能変数は特殊ケースです。 型拡張文字「?」を使用して作成された変数は、NULL に初期化されます。
NULL 可能変数は特殊ケースです。 型拡張文字「?」を使用して作成された変数は、NULL に初期化されます。 i4glItemsNullable プロパティーによって制御される変数は、異なった初期値のセットを持っています。 i4glItemsNullable を参照してください。
下の表に、さまざまな型の自動初期化値の詳細を示します。表 1. 初期化時に自動的に代入される値 型 初期化値 ANY NULL BIN (および整数型)、HEX、FLOAT、SMALLFLOAT 2 進ゼロ BLOB、CLOB lobLib.freeBlob() または lobLib.freeClob() を使用してリセット BOOLEAN FALSE CHAR、MBCHAR 単一バイトのブランク DATE、TIME、TIMESTAMP マシン・クロックの (TIMESTAMP の場合は、マスクが必要とするバイト数の) 値 DBCHAR 2 バイトのブランク DECIMAL、MONEY、NUM、NUMC、PACF 数値のゼロ INTERVAL 前に正符号が付いた (マスクが必要とするバイト数の) 数値のゼロ STRING "" (NULL ストリング) UNICODE ユニコードのブランク (16 進の 0020)
注: ライブラリー間の循環依存関係によって、初期化中に問題が生じます。依存関係は、以下の例のように、初期値が他のライブラリー内の変数に依存している変数が 2 つのライブラリーに含まれている場合に循環になります。
library lib1
a int = 1;
b int = lib2.c;
end
library lib2
c int = 2;
d int = lib1.a;
end
プログラムが lib1 または lib2 のいずれかを使用しようとすると、EGL は例外をスローします。
互換性
| プラットフォーム | 問題 |
|---|---|
| COBOL 生成 | EGL により生成された COBOL プログラムはすべてのレコードを初期化します。 レコード内のフィールドは、上記の表で説明されているように変数が EGL 型に初期化されてから、COBOL INITIALIZE 文をオーバーライドして、COBOL データ型に基づき初期化が行われます。 注: NUM 型の変数と CHAR 型の変数を比較する COBOL プログラムを生成する場合は、
コードによってフィールドが初期化されるようにしてください。そうしないと、比較の実行時にプログラムで障害が発生し、異常終了メッセージが表示される場合があります。この場合、例外処理コードは実行されません。これと同様の COBOL 固有の注意事項が、ローカル・レコードのフィールドに適用されます。
|
| JavaScript 生成 | サポートされないデータ型は、ArrayDictionary、BIN (小数点以下の桁数を含むもの)、BLOB、CHAR、CLOB、DBCHAR、HEX、INTERVAL、MBCHAR、NUMC、STRING (サイズ制限を含むもの)、PACF、UNICODE、および構造化されたレコード・パーツです。 |