Programmiersprache Pascal

Arrays

Ein Array-Typ ist ein aggregierter Datentyp.
Er schließt verschiedene Komponenten ein, die alle in ihrem Datentyp (skalar oder aggregiert) übereinstimmen.
Die Komponenten werden über einen Index (eindimensionales Array) oder über eine Menge von Indizes (mehrdimensionales Array) identifiziert.
Ein Array kann problemlos sehr viele Komponenten besitzen, sofern der dafür benötigte Speicherplatz zur Verfügung steht.

Arrays werden im Deutschen zuweilen auch als Felder bezeichnet. Beim Lesen von Pascal-Literatur ist jedoch Vorsicht geboten: Als Felder werden hier oft die Komponenten eines Records bezeichnet.
Ein anderer Begriff, der mitunter für Arrays benutzt wird, ist Reihung.


Deklaration eines eindimensionalen Arrays

  TYPE name = ARRAY [ indextyp ] OF typ; 
indextyp muß ein ordinaler Datentyp sein.
Meist wird für indextyp ein anonymer Teilbereichstyp angegeben.

Ein ordinaler Datentyp besitzt eindeutig bestimmte Werte imin und imax:

imin: Wert mit der kleinsten Ordinalzahl
imax: Wert mit der größten Ordinalzahl
imax - imin + 1 ist dann die Länge des Arrays, d.h. die Anzahl seiner Komponenten.

Häufig wird für indextyp nicht ein Typbezeichner, sondern ein anonymer INTEGER-Teilbereichstyp in der Form

  imin..imax
angegeben.
In Pascal wird oft imin = 1 gewählt.

Beispiel:

  TYPE nr = ARRAY[1..10000] OF INTEGER;
       koord = ARRAY[1..3] OF REAL;

       monate = 1..12;
       abrechnung = ARRAY[monate] OF REAL;

       farbe = (rot, gruen, blau);
       rgb = ARRAY[farbe] OF INTEGER;
Die Zuweisung von Werten an ein Array muß komponentenweise erfolgen.
Beispiel:
  VAR a : ARRAY[1..10] OF INTEGER;
      i : INTEGER;

  FOR i:= 1 TO 10 DO 
    a[i] := i*i;
Einem Array kann der Wert eines anderen Arrays zugewiesen werden, wenn beide den gleichen Typ besitzen.
Beispiel:
  VAR a, b : ARRAY[1..10] OF INTEGER;

  a := b;
  a := b + 1;          { !! nicht zulaessig !! }
  a := b * b;          { !! nicht zulaessig !! }

Deklaration eines mehrdimensionalen Arrays

  TYPE name = ARRAY [ indextyp_1, ..., indextyp_n ] OF typ;
indextyp_1, ..., indextyp_n müssen jeweils ordinale Datentypen sein.

Alternativ könnte die Deklaration auch wie folgt vorgenommen werden:

  TYPE name = ARRAY [ indextyp_1 ] OF
              ARRAY [ indextyp_2 ] OF
                ...
              ARRAY [ indextyp_n ] OF typ;
Beispiel:
  TYPE matrix = ARRAY[1..10, 1..10] OF INTEGER;
Pascal sieht keine obere Grenze für die Anzahl von Indizes vor, implementationsabhängig kann aber eine solche Grenze existieren.

Bemerkung:
Es sollten im Höchstfall drei Indizes verwendet werden, da sonst die Programmlesbarkeit zu sehr leidet.


Gepackte Arrays

Dem Schlüsselwort ARRAY kann das Schlüsselwort PACKED vorangestellt werden:

  TYPE name = PACKED ARRAY [ ... ] OF typ;
PACKED ist die Erlaubnis für ein Pascal-System nach einer speichersparenden Ablage der Daten zu suchen. Die Wirkung hängt vom jeweiligen Pascal-System ab.

Es ist damit zu rechnen, daß bei vielen Pascal-Systemen die Angabe von PACKED ohne unmittelbare Wirkung auf die Art der Datenspeicherung bleibt.

Im Zusammenhang mit Zeichenketten besitzt das Schlüsselwort PACKED jedoch stets eine gewisse Bedeutung.
Beispiel:

  TYPE pstr = PACKED ARRAY[1..20] OF CHAR;
  VAR s1 : pstr;

  s1 := 'Zeichenkette';
Die Alternativvariante ohne PACKED würde die Wertzuweisung erheblich erschweren:
  TYPE str = ARRAY[1..20] OF CHAR;
  VAR s2 : str;

  s2[1] := 'Z';
  s2[2] := 'e';
  s2[3] := 'i';
       ...

Anfangswertzuweisung an Arrays

Standard Pascal

Nicht möglich.

Extended Pascal

Bei der Variablendeklaration kann für jede Komponente eines Arrays ein Anfangswert angegeben werden:

  ... VALUE [index_1: wert_1; ...; index_n: wert_n];
Soll für eine größere Anzahl von Komponenten der gleiche Anfangswert zugewiesen werden, so kann die Aufzählung ersetzt werden durch
  ... VALUE [ ...; OTHERWISE wert ];
Beispiel:
  CONST n = 5;
  TYPE arr = ARRAY[1..n] OF INTEGER;
  VAR a : arr;                         { nicht initialisiert }
      b : arr VALUE [1: 1; 2: -1; 3: -1; 4: 4; 5: -1];
      c : arr VALUE [1: 1; 4: 4; OTHERWISE -1];
      d : arr VALUE [OTHERWISE 1];
      e : arr VALUE 1                  { !! nicht zulaessig !! }
Indirekt wird auch in dem folgenden Beispiel eine Anfangswertbelegung des Arrays erreicht:
  TYPE int1 = INTEGER VALUE 1;
       arr = ARRAY[1..5] OF int1;
Alle Komponenten (Elemente) eines Arrays vom Typ arr sind mit dem Wert 1 vorbelegt.

Turbo Pascal

Bei der Deklaration als "typisierte Konstante" kann für jede Komponente eines Arrays ein Anfangswert angegeben werden:

  CONST name : array_typ = ( wert_1, ..., wert_n );
name ist eine Variable !

Beispiel:

  TYPE arr = ARRAY[1..5] OF INTEGER;
  CONST b : arr = (1, -1, -1, 4, -1);
        c : arr = (1);                      { !! Syntaxfehler !! }
        d : arr = (1, 1, 1, 1, 1);

Siehe auch



P. Böhme, 16.09.1995