いずれの場合でも、サポートされる次元の最大数は 7 です。
宣言の中でエレメントの数を指定する必要はありませんが、宣言した場合は、その数が初期のエレメント数を示します。 また、宣言の中で、一連の配列定数をリストすることによって初期のエレメント数を指定することもできます。ただし、これはプリミティブ変数でのみ可能であり、レコードでは不可能です。
動的配列を宣言するための構文を以下の例で示します。
// エレメントの数が 5 つ以下の配列 myDataItem01 CHAR(30)[] { maxSize=5 }; // エレメントの数が 6 つ以下の配列で、 // 初期のエレメントは 4 つ myDataItem02 myDataItemPart[4] { maxSize=6 }; // エレメントなしの配列 // ただし、最大サイズは可能な限り最大となります。 myRecord myRecordPart[]; // 3 つのエレメントの配列で、エレメントには // 値 1、3、5 が代入されます。 position int[] = [1,3,5];
リテラル整数を使用してエレメントの数を初期設定できますが、変数と定数は、どちらも無効です。
// 有効。maxsize で最初の次元の // 最大値を指定 myInt01 INT[3][]; myInt02 INT[4][2][] {maxsize = 12}; myInt03 INT[7][3][1]; // 次の例では、配列定数により、外側の配列が // 初期に 3 つのエレメントを持つことを示しています。 // 外側の配列の第 1 エレメントは、2 つの // エレメント (値は 1 と 2) からなる配列です。 // 外側の配列の第 2 エレメントは、3 つのエレメント // (値は 3、4、5) からなる配列です。 // 外側の配列の第 3 エレメントは、2 つの // エレメント (値は 6 と 7) からなる配列です。 myInt04 INT[][] = [[1,2],[3,4,5],[6,7]];
// 無効 myInt04 INT[][3]; myInt05 INT[5][][2];
プログラムまたは関数のパラメーターとして指定された配列が、エレメントの数を指定することはできません。
コードで動的配列を参照する場合、添え字付きの大括弧を指定しないと、配列全体が参照されます。
メモリー不足状態は破局的エラーとして扱われ、プログラムが終了します。
series.reSize(100);
series INT[][]; // 配列の配列である series の // 第 2 エレメントのサイズを変更 series[2].reSize(100);
以下の説明の中の arrayName を配列名で置き換えてください。 また、名前はパッケージ名かライブラリー名、またはその両方で修飾できることに注意してください。
appendArray のエレメントの型は、arrayName のエレメントの型と同じでなければなりません。
リテラルを割り当てるための規則は、『代入』で説明したとおりです。
content は新しい内容 (配列の適切な型の定数または変数) で、 index は新規エレメントのロケーションを示す整数リテラルまたは数値変数です。
index が配列内のエレメント数より大きい場合は、 関数は新規エレメントを配列の末尾に作成し、配列サイズを 1 つずつ増分します。
index は、 除去するエレメントのロケーションを示す整数リテラルまたは数値変数です。
動的配列は、EGL 関数に引き数として渡すことができます。関連するパラメーターは、引き数と同じ型の動的配列として定義する必要があり、 データ項目については、型の長さおよび小数点以下の桁数は同じでなければなりません (存在する場合)。
動的配列は、別のプログラムに引き数として渡すことはできません。
Function getAll (employees Employee[]) ; end
実行時に、パラメーターの最大サイズは、対応する引き数に宣言された最大サイズになります。 関数または呼び出し先プログラムは、配列のサイズを変更することができ、 その変更は呼び出し側コードで有効になります。
Record myFixedRecordPart 10 mySi CHAR(1)[3]; end
myRecord という固定レコードが、このパーツに基づいている場合、シンボル myRecord.mySi は、3 つのエレメント (それぞれが 1 文字) からなる 1 次元配列を参照します。
それ自体が配列ではない配列エレメントは、他のエレメントと同様に 1 つのフィールドであり、さまざまな方法で参照できます。例えば、assignment 文の中で参照したり、関数呼び出しの引き数として参照したりできます。
myRecord.mySi のような 1 次元配列のエレメントを参照するときは、配列の名前を指定し、その後ろに大括弧で囲った添え字を指定します。添え字には、整数か、整数へと解決されるフィールドを指定します。例えば、myStruct.mySi[2] のようにすると、例に示した配列の 2 番目のエレメントを参照できます。 添え字は、1 から構造体フィールドの occurs 値の間で変化します。 この範囲の外で添え字が指定されると、ランタイム・エラーが発生します。
フィールドを必要とするコンテキスト内で構造体フィールド配列の名前を使用し、大括弧で囲った添え字を指定しなかった場合、EGL では、VisualAge® Generator との互換性モードであるときに限り、配列の最初のエレメントを参照していると見なされます。 各エレメントを明示的に識別することをお勧めします。 VisualAge Generator との互換性モードでない場合は、各エレメントを明示的に識別する必要があります。
// 以下は、3 つのうち最初のエレメントを参照します myRecord.mySi[valueOne] // お勧めしません。これは // VisualAge Generator との互換性が // compatibility is in effect: myRecord.mySi // 以下は、2 つ目のエレメントを参照します myRecord.mySi[valueTwo]
record myRecord01Part 10 name[3]; 20 firstOne CHAR(20); 20 midOne CHAR(20); 20 lastOne CHAR(20); end
myRecord01 というレコードが前のパーツに基づいている場合、 シンボル myRecord01.name は、それぞれが 60 文字の長さを持つ 3 つのエレメントの 1 次元配列を参照し、myRecord01 の長さは 180 になります。
副構造を参照しなくても、myRecord01.name 内の各エレメントを参照することは可能です。 例えば、myRecord01.name[2] は 2 番目のエレメントを参照します。 また、エレメント内の副構造を参照することもできます。例えば、固有性の規則が満たされているなら、以下のいずれかの方法で、2 番目のエレメントの最後の 20 文字を参照できます。
myRecord01.name.lastOne[2] myRecord01.lastOne[2] lastOne[2]
最後の 2 つは、生成可能パーツ・プロパティー allowUnqualifiedItemReferences が yes に設定されている場合にのみ有効です。
各種の参照については、『変数および定数の参照』を参照してください。
1 より大きい occurs 値を持つ構造体項目に副構造があり、従属の構造体項目で occurs 値が 1 より大きい場合、その従属の構造体項目は、追加の次元を持つ配列を宣言します。
record myRecord02Part 10 siTop[3]; 20 siNext CHAR(20)[2]; end
// 行 1、列 2 とします。 // 次の構文を強くお勧めします。 // なぜなら、動的配列に対しても機能するからです。 myRecord02.siTop[1].siNext[2] // 次の構文は、VisualAge Generator との // 互換性のためにサポートされています。 myRecord02.siTop.siNext[1,2]
参照されるメモリーの領域を明確にするため、多次元配列ではどのようにデータが保管されるのかを考えましょう。 現在の例では、myRecord02 は 120 バイトです。参照される領域は、それぞれが 40 バイトの長さを持つ、3 つのエレメントの 1 次元配列に分けられます。
siTop[1] siTop[2] siTop[3]
さらに、この 1 次元配列の各エレメントは、同じメモリーの領域の中で、それぞれが 20 バイトの長さを持つ 2 つのエレメントの配列に分けることができます。
siNext[1,1] siNext[1,2] siNext[2,1] siNext[2,2] siNext[3,1] siNext[3,2]
// i、j、myTopOccurs、および myNextOccurs は、データ項目です。 // myRecord02 はレコードです。 // sysLib.size() は、構造体項目の occurs 値を戻します。 i = 1; j = 1; myTopOccurs = sysLib.size(myRecord02.siTop); myNextOccurs = sysLib.size(myRecord02.siTop.siNext); while (i <= myTopOccurs) while (j <= myNextOccurs) myRecord02.siTop.siNext[i,j] = "abc"; j = j + 1; end i = i + 1; end
多次元配列の各次元に応じた値を指定する必要があります。 例えば、myRecord02.siTop.siNext[1] という参照は、2 次元配列では無効です。
record myRecord03Part 10 siTop[3]; 20 siNext[2]; 30 siLast CHAR(20)[5]; end
// 推奨されているように、それぞれのレベルを示し、 // 各レベルごとに添え字を指定します。 myRecord03.siTop[3].siNext[2].siLast[5] // それぞれのレベルを示し、下位レベルで添え字を指定する myRecord03.siTop.siNext[3,2].siLast[5] myRecord03.siTop.siNext[3][2].siLast[5] // それぞれのレベルを示し、最下位レベルで添え字を指定する myRecord03.siTop.siNext.siLast[3,2,5] myRecord03.siTop.siNext.siLast[3,2][5] myRecord03.siTop.siNext.siLast[3][2,5] myRecord03.siTop.siNext.siLast[3][2][5] // コンテナーと最後のレベルを添え字付きで示す myRecord03.siLast[3,2,5] myRecord03.siLast[3,2][5] myRecord03.siLast[3][2,5] myRecord03.siLast[3][2][5] // 最後のレベルのみを添え字付きで示す siLast[3,2,5] siLast[3,2][5] siLast[3][2,5] siLast[3][2][5]
前の例で示したように、多次元配列のエレメントは、さまざまな方法で大括弧に入れた一連の添え字を追加することによって参照します。 いずれの場合でも、最初の添え字は第 1 の次元を参照し、2 番目の添え字は第 2 の次元を参照し、その後も同様です。 各添え字の値は、1 から関連する構造体項目の occurs 値の間で変化します。 添え字がこの範囲の外の数値に解決されると、ランタイム・エラーが発生します。
myRecord03.siTop.siNext.siLast
myRecord03.siLast
siLast
myRecord03.siTop[3].siNext[2].siLast[5]
myRecord03.siTop.siNext[3,2].siLast[5]
myRecord03.siTop.siNext.siLast[3,2,5]
// 無効 myRecord03.siTop[3,2,5].siNext.siLast
myRecord03.siTop.siNext.siLast[3,2,5] myRecord03.siTop.siNext.siLast[3,2][5] myRecord03.siTop.siNext.siLast[3][2,5] myRecord03.siTop.siNext.siLast[3][2][5]
関連する参照項目
add
代入
EGL システム制限
get
in 演算子
sysLib.size