いずれの場合でも、サポートされる次元の最大数は 7 です。
宣言の中でエレメントの数を指定する必要はありませんが、宣言した場合は、その数が初期のエレメント数を示します。 また、宣言の中で、一連の配列定数をリストすることによって初期のエレメント数を指定することもできます。ただし、これはプリミティブ変数でのみ可能であり、レコードでは不可能です。
動的配列を宣言するための構文を以下の例で示します。
// エレメントの数が 5 つ以下の配列 myDataItem01 CHAR(30)[] { maxSize=5 }; // エレメントの数が 6 つ以下の配列で、 // 初期のエレメントは 4 つ myDataItem02 myDataItemPart[4] { maxSize=6 }; // エレメントなしの配列 // ただし、最大サイズは可能な限り最大となります。 myRecord ExampleRecordPart[]; // 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 を配列名で置き換えます。 また、名前はパッケージ名かライブラリー名、またはその両方で修飾できることに注意してください。
arrayName.appendElement(content ArrayElement in)
この関数は、指定された配列の末尾にエレメントを置き、サイズを 1 ずつ増分します。 content は、適切な型の変数に置き換えることができます。 または、操作中に作成されたエレメントに割り当てられるリテラルを指定できます。 このプロセスではデータがコピーされるため、 ある変数を割り当てても、その変数を比較または他の目的に使用できます。
リテラルを割り当てるための規則は、『代入』で説明したとおりです。
arrayName.getSize ( ) returns (INT)
この関数は、その配列内のエレメント数を示す整数を戻します。 動的配列を処理するときは、この関数を SysLib.size の代わりに使用することをお勧めします。
SysLib.size( ) returns (INT)
しかし、動的配列を処理するときは、arrayName.getSize ( ) を使用することをお勧めします。
arrayName.insertElement (content ArrayElement in, index INT in)
content は新しい内容 (配列の適切な型の定数または変数) で、 index は新規エレメントのロケーションを示す整数リテラルまたは数値変数です。
index が配列内のエレメント数より大きい場合は、 関数は新規エレメントを配列の末尾に作成し、配列サイズを 1 つずつ増分します。
arrayName.removeElement(index INT in)
この関数は、指定されたロケーションのエレメントを除去し、 配列サイズを 1 つずつ減分し、除去されたエレメントの後ろにある各エレメントの指標を減分します。
index は、 除去するエレメントのロケーションを示す整数リテラルまたは数値変数です。
arrayName.resize(size INT in)
この関数は、配列の現行サイズを size (整数リテラル、定数、変数のいずれか) で指定されたサイズまで増減します。 size の値が、その配列に許容される最大サイズより大きい場合は、実行単位が終了します。
arrayName.reSizeAll(sizes INT[
] in)
この関数は、多次元配列のすべての次元を増減します。 パラメーター sizes は整数の配列で、連続したそれぞれのエレメントが、逐次 1 つの次元のサイズを指定します。 サイズ変更された次元数が arrayName 内の次元数より大きい場合、または sizes 内のエレメントの値が arrayName の相応の次元内で許容される最大サイズより大きい場合は、実行単位が終了します。
arrayName.setMaxSize (size INT in)
この関数は、その配列内で許容されるエレメントの最大値を設定します。 この最大サイズをその配列の現行サイズより小さく設定した場合は、実行単位が終了します。
arrayName.setMaxSizes(sizes INT[
] in)
この関数は、多次元配列のすべての次元を設定します。 パラメーター sizes は整数の配列で、連続したそれぞれのエレメントが、逐次 1 つの次元の最大サイズを指定します。 指定された次元数が arrayName 内の次元数より大きい場合、または sizes 内のエレメントの値が arrayName の相応の次元内で現行エレメント数より小さい場合は、実行単位が終了します。
動的配列は、EGL 関数に引数として渡すことができます。関連するパラメーターは、 引数と同じ型の動的配列として定義する必要があり、データ項目については、 型の長さおよび小数点以下の桁数は同じでなければなりません (存在する場合)。
Function getAll (employees Employee[]) ; end
実行時に、パラメーターの最大サイズは、対応する引数に宣言された最大サイズになります。呼び出された関数は配列のサイズを変更することができ、その変更は呼び出し側コードで有効になります。
Record ExampleFixedRecordPart 10 mySi CHAR(1)[3]; end
myRecord という固定レコードが、このパーツに基づいている場合、シンボル myRecord.mySi は、3 つのエレメント (それぞれが 1 文字) からなる 1 次元配列を参照します。
それ自体が配列ではない配列エレメントは、他のエレメントと同様に 1 つ のフィールドであり、さまざまな方法で参照できます。 例えば、代入文の中で参照したり、関数呼び出しの引数として参照したりできます。
エレメントの添え字として、整数に解決される任意の数式を使用できますが、 式に、関数呼び出しを組み込むことはできません。
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]