Die Regeln für eine EGL-Feldgruppe richten sich nach dem Feldgruppentyp.
In allen Fällen werden maximal sieben Dimensionen unterstützt.
In EGL hat das erste Element in einer Feldgruppe den Index 1. In vielen Programmiersprachen hat das erste Element den Index 0.
Ein Feldgruppenliteral besteht aus einer einleitenden eckigen Klammer gefolgt von einer durch Kommas unterteilten Liste von Literalen (einschließlich anderer Feldgruppenliterale) oder Ausdrücken (einschließlich von Feldgruppenvariablen) und einer abschließenden eckigen Klammer. Jedes einzelne Feldgruppenliteral weist einen Typ auf und kann überall dort verwendet, wo eine Feldgruppe des betreffenden Typs zugelassen ist (z. B. als Initialisierungsoperator für eine Feldgruppenvariable). Die folgende Tabelle enthält Beispiele für Feldgruppenliterale:
| Feldgruppenliteral | Typ |
|---|---|
| [ 1, 2, 3 ] | SMALLINT[] |
| [ "hi", "Mom" ] | STRING[] |
| [ new myRecord, new myRecord ] | myRecord[] |
| [ (myPay < 0), (myPay > 0) ] | BOOLEAN[] |
| [ [ 1, 2 ], [ 3, 4 ] ] | SMALLINT[][] |
| [ 3, "cow", [ 4.5, 6.7 ] ] | ANY[] |
Weichen die Typen der Elemente im Feldgruppenliteral voneinander ab, ergibt sich als Typ der Feldgruppe der Typ ANY. Die Elemente in der Feldgruppe müssen nicht untereinander zuordnungskompatibel sein.
multiDimensionArray INT[2][3];
Die folgenden Beispiele verdeutlichen die Syntax für die Deklaration einer dynamischen Feldgruppe:
// Feldgruppe mit maximal 5 Elementen
myNames CHAR(30)[] { maxSize=5 };
// Feldgruppe mit maximal 6 Elementen
// und anfänglich 4 Elementen
myDataItemArray myDataItem[4] { maxSize=6 };
// Feldgruppe ohne Elemente,
// deren maximale Größe den höchstmöglichen Wert aufweist.
myRecordArray ExampleRecord[];
// Feldgruppe mit 3 Elementen, denen
// die Werte 1, 3 und 5 zugeordnet sind.
position int[] = [1,3,5];
Für die Initialisierung der Elementanzahl können Sie ein ganzzahliges Literal verwenden. Variablen oder Konstanten sind in diesem Fall nicht zulässig.
myIntArray INT[];
myIntArray[2] = 13; // Führt zu einer Ausnahme des Typs 'NullValueException'.
myIntArray2 INT[3]
myIntArray2[2] = 13; // Dies ist zulässig.
// Gültig. maxsize gibt das Maximum
// für die erste Dimension an.
myIntArray01 INT[3][];
myIntArray02 INT[4][2][] {maxsize = 12};
myIntArray03 INT[7][3][1];
// Beim nächsten Beispiel gibt die Feldgruppenkonstante
// an, dass die übergeordnete Feldgruppe anfänglich über 3 Elemente verfügt.
// Das erste Element der übergeordneten Feldgruppe ist
// eine Feldgruppe bestehend aus zwei Elementen mit den Werten 1 und 2.
// Das zweite Element der übergeordneten Feldgruppe ist
// eine Feldgruppe bestehend aus drei Elementen mit den Werten 3, 4 und 5.
// Das dritte Element der übergeordneten Feldgruppe ist
// eine Feldgruppe bestehend aus zwei Elementen mit den Werten 6 und 7.
myIntArray04 INT[][] = [[1,2],[3,4,5],[6,7]];
// NICHT gültig
myInt04 INT[][3];
myInt05 INT[5][][2];
Ein Speichermangel wird als nicht behebbarer Fehler angesehen und beendet das Programm.
myArray1 int[3] {1,2,3}; // Feldgruppe mit 3 Elementen mit den Werten 1, 2 und 3
Dies ist effizienter als eine Gleichsetzung der neuen Feldgruppe mit dem Feldgruppenliteral [1,2,3]. Beim Feldgruppenliteral muss von EGL zuerst das Feldgruppenliteral erstellt werden, bevor der Wert zu myArray1 zugeordnet wird. Bei Verwendung eines Wertdefinitionsblocks wird nur myArray1 erstellt.
myArray2 int[] {1,2,3}; // Löst eine Ausnahme des Typs 'IndexOutOfBoundsException' aus.
myArray3
int[] {}; // Feldgruppe mit Nulllänge, aber keine Null-Feldgruppe
Eine dynamische Feldgruppe kann als Argument an eine EGL-Funktion übergeben werden. Der zugehörige Parameter muss als dynamische Feldgruppe desselben Typs wie das Argument definiert sein. Elemente müssen in Argument und Parameter dieselbe Länge und dieselbe Anzahl von Dezimalstellen (soweit vorhanden) aufweisen.
Eine an ein Programm oder eine Funktion übergebene Feldgruppe kann keine Elementanzahl angeben.
Function getAll (CustomerRecord myCustomers[])
;
end
Zur Laufzeit entspricht die maximale Größe eines Parameters der für das entsprechende Argument deklarierten maximalen Größe. Von der aufgerufenen Funktion kann die Größe des Arguments verändert werden. Die Änderung wird im aufrufenden Code angewendet.
Record ExampleStructuredRecord
10 mySi CHAR(1)[3];
end
Basiert eine Variable eines strukturierten Datensatzes namens myRecord auf dieser Definition, bezieht sich der Name myRecord.mySi auf eine eindimensionale Feldgruppe mit 3 Elementen, wobei es sich bei jedem Element um ein Zeichen handelt.
Ein Feldgruppenelement, bei dem es sich nicht um eine Feldgruppe handelt, stellt ein Feld wie alle anderen Felder auch dar. Sie können dieses Feld auf unterschiedliche Weise referenzieren, z. B. in einer Zuordnungsanweisung oder als Argument bei einem Funktionsaufruf.
Bei einem Elementindex kann es sich um einen beliebigen numerischen Ausdruck handeln, der in eine ganze Zahl aufgelöst wird. Der Ausdruck darf jedoch keinen Funktionsaufruf enthalten.
Sie können auf ein Element einer eindimensionalen Feldgruppe wie z. B. myRecord.mySi verweisen, indem Sie den Namen der Feldgruppe gefolgt von einer in eckige Klammern gesetzten Indexnummer verwenden. Auf das zweite Element der Beispielfeldgruppe können Sie beispielsweise mit myStruct.mySi[2] verweisen. Als Index ist eine Zahl von 1 bis zur maximalen Anzahl von Elementen in der Feldgruppe zulässig. Liegt ein Index außerhalb dieses Bereichs, wird ein Laufzeitfehler ausgelöst.
Sie können den Namen einer Feldgruppe mit Strukturfeldern nicht in einem Kontext verwenden, indem ein Einzelwert benötigt wird, sofern Sie nicht einen Index angeben (mögliche Ausnahmen hierzu finden Sie unter der Überschrift 'Kompatibilität' in diesem Abschnitt).
Record Record01
10 name[3];
20 firstOne CHAR(20);
20 midOne CHAR(20);
20 lastOne CHAR(20);
end
Basiert ein Datensatz namens myRecord01 auf der oben angegebenen Datensatzdefinition, verweist der Name myRecord01.name auf eine eindimensionale Feldgruppe mit drei Elementen, die wiederum jeweils 60 Zeichen enthalten, und die Länge von myRecord01 beträgt 180.
Sie können auf die einzelnen Elemente in myRecord01.name verweisen, ohne die Unterstruktur zu referenzieren. myRecord01.name[2] verweist z. B. auf das zweite Element. Sie können auch auf eine Unterstruktur innerhalb eines Elements verweisen. Sofern die Regeln für die Eindeutigkeit von Elementen erfüllt sind, können Sie z. B. die letzten 20 Elemente des zweiten Elements auf eine der folgenden Weisen referenzieren:
myRecord01.name.lastOne[2]
myRecord01.lastOne[2]
lastOne[2]
Das letzte Beispiel ist nur gültig, wenn die Eigenschaft allowUnqualifiedItemReferences mit YES definiert ist.
Weitere Informationen zu den verschiedenen Arten von Referenzen finden Sie im Abschnitt zum Referenzieren von Variablen in EGL.
Weist ein Strukturfeld mit mehreren Elementen eine untergeordnete Struktur auf und enthält das untergeordnete Strukturfeld ebenfalls mehrere Elemente, wird vom untergeordneten Strukturfeld eine Feldgruppe mit einer zusätzlichen Dimension deklariert (siehe 'Kompatibilität').
Record Record02
10 siTop[3];
20 siNext CHAR(20)[2];
end
// Zeile 1, Spalte 2.
// Die nachfolgende Syntax wird dringend empfohlen,
// da sie auch mit dynamischen Feldgruppen verwendet werden kann.
myRecord02.siTop[1].siNext[2]
// Die nachfolgende Syntax wird unterstützt,
// eine Verwendung wird jedoch nicht empfohlen.
myRecord02.siTop.siNext[1,2]
Bei der Frage, welche Speicherbereiche referenziert werden, ist es hilfreich zu wissen, wie Daten in einer mehrdimensionalen Feldgruppe gespeichert werden. Der als Beispiel aufgeführte Datensatz myRecord02 umfasst 120 Bytes. Der referenzierte Bereich ist in eine eindimensionale Feldgruppe mit drei Elementen von jeweils 40 Bytes unterteilt:
siTop[1] siTop[2] siTop[3]
Die einzelnen Elemente der eindimensionalen Feldgruppe sind wiederum jeweils in eine Feldgruppe mit zwei Elementen von jeweils 20 Bytes in demselben Speicherbereich unterteilt:
siNext[1,1] siNext[1,2] siNext[2,1] siNext[2,2] siNext[3,1] siNext[3,2]
// i, j, myTopIndex und myNextIndex sind Variablen.
// myRecord02 ist ein Datensatz und
// sysLib.size() gibt die Anzahl der Elemente in einem Strukturfeld zurück.
i = 1;
j = 1;
myTopIndex = sysLib.size(myRecord02.siTop);
myNextIndex = sysLib.size(myRecord02.siTop.siNext);
while (i <= myTopIndex)
while (j <= myNextIndex)
myRecord02.siTop.siNext[i,j] = "abc";
j = j + 1;
end
i = i + 1;
end
Für jede Dimension einer mehrdimensionalen Feldgruppe müssen Sie einen Wert angeben. Die Referenz myRecord02.siTop.siNext[1] ist beispielsweise nicht für eine zweidimensionale Feldgruppe zulässig.
Record Record03
10 siTop[3];
20 siNext[2];
30 siLast CHAR(20)[5];
end
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]
// NICHT gültig
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]
| Plattform | Problem |
|---|---|
| COBOL-Generierung | Mehrdimensionale Feldgruppen werden nicht für dynamische Feldgruppen unterstützt. |
| JavaScript-Generierung | Die folgenden Typen werden unterstützt: ANY,
BIGINT, BIN (nur ohne Dezimalstellen), Boolean, DataItem,
DATE, DECIMAL, Delegate, Dictionary, FLOAT, INT, NUM, NUMBER, SMALLFLOAT,
SMALLINT, STRING (nur ohne Größenbegrenzung) , TIME,
TIMESTAMP, NUM, MONEY, Serviceabschnitte, Schnittstellenabschnitte, externe Typen
(Stereotyp JavaScript),
Feldgruppen mit unterstützten Typen, nicht strukturierte Basisdatensätze sowie
Ausnahmedatensätze und
SQL-Datensatzabschnitte. Die folgenden Typen werden nicht unterstützt: ArrayDictionary, BIN (mit Dezimalstellen), BLOB, CHAR, CLOB, DBCHAR, HEX, INTERVAL, MBCHAR, NUMC, STRING (mit Größenbegrenzung), PACF, UNICODE und strukturierte Datensatzabschnitte. |
| VisualAge Generator-Kompatibilitätsmodus | Wenn Sie den Namen einer Feldgruppe mit Strukturfeldern in einem Kontext ohne Index verwenden, in dem ein Einzelwert benötigt wird, geht EGL davon aus, dass Sie sich auf das erste Element der Feldgruppe beziehen. |