vor

Objektorientierte Programmierung mit Object-Pascal

weiter

4.12 Arrays und Records

Records

Gehören verschiedene Informationen z. B. über ein Mitglied oder einen Kunden zusammen, so kann man sie auf einer einzigen Karteikarte (engl. record card) verwalten. Dies ist auch in Object-Pascal möglich, auch wenn die Einzelinformationen unterschiedlichen Typs sind.

Eine solche Verbundvariable (ein Record) wird folgendermaßen deklariert:

var Kunde : Record
               KdnNummer    : Integer;
               Vorname      : String;
               Name         : String;
               AnfangStunde : Byte;
               AnfangMinute : Byte;
               EndeStunde   : Byte;
               EndeMinute   : Byte;
            end;


Die Teilvariablen werden zwischen RECORD und END zusammengefasst.

Will man die einzelnen Teilvariablen des Records ansprechen, so trennt man die Hauptvariable und die eingebetteten Teilvariablen durch einen Punkt:

Kunde.Name := Meier;
Kunde.AnfangMinute := 25;



Arrays

Im Gegensatz zu einem Record, in dem mehrere Variablen unterschiedlichen Typs zusammengefasst sein können, kann man in einem Datenfeld, einem Array, Einzelvariablen gleichen Typs zusammenfassen. Jede Einzelvariable wird nicht über einen Namen, sondern mit einer Indexnummer angesprochen.

Die Deklaration eines eindimensionalen Arrays erfolgt folgendemaßen:

var Arrayname: Array[von .. bis] of Elementtyp;

Das wird mit dem Beispiel deutlich, in dem 100 Zufallszahlen bereit gestellt werden:

var ZZahl: Array[1 .. 100] of Integer;
    i : Byte;
begin
  for i := 1 to 100 do ZZahl[i] := Trunc(Random(1000));
...


Der Index des Arrays muss nicht bei 1 beginnen, er muss nicht einmal eine Zahl sein. Er muss aber ordinal sein.

Auch Records können Array-Elemente sein.

Eindimensionale Arrays sind lange Listen, bei denen jedes einzelne Listenelement mit einem Indexwert erreicht werden kann.

Zweidimensionale Arrays kann man sich als Matrix vorstellen. Hier als Beispiel die Punkte einer Ebene:

var Punkt: Array[-100..100,-50..50] of Boolean;

Mit dem ersten Index (von -100 bis 100) wird die x-Koordinate bestimmt; mit dem zweiten Index (-50 bis 50) die y-Koordinate des einzelnen Punktes. Dem Punkt mit der Position (25, 40) kann demnach mit
Punkt[25,40] := true;
ein Wert zugewiesen werden.

Natürlich kann man auch drei- und mehrdimensionale Arrays deklarieren. Bedenken solte man dabei aber, dass damit ganz schnell riesige Speicherbereiche des Arbeitsspeichers blockiert werden können, was evtl. (noch) ein Problem sein kann.

var Beispiel: Array[1..100,1..100,1..100,1..100] of Integer;

reserviert z. B. schnell mal 100 * 100 * 100 * 100 * 4 Byte, also fast schlappe 400 MB!

Ab Delphi 4.0 gibt es sogar dynamische Arrays, bei denen die Ober- und Untergrenzen nicht mehr angegeben werden müssen. Der unterste Index ist immer 0. Genutzt werden kann das dynamische Array erst, wenn mit der Prozedur SetLength(Arrayname, MaxIndex) der Speicherplatz reserviert wird. Der Vorteil dabei ist, dass man später mit einem erneuten Aufruf von Setlength(Arrayname, neuIndex) den Speicherplatz während der Laufzeit des Programms erweitern kann.

Beispiele für ein eindimesionales und ein mehrdimensionales dynamisches Array:

var
DynEinDimArray: Array of Integer;
DynMehrDimArray: Array of Array of String;
...
SetLength(DynEinDimArray, 25);
SetLength(DynMehrDimArray, 25, 10);


vor

Inhaltsverzeichnis

weiter