Das Aggregat ist illegal, d.h. wird vom Compiler zurückgewiesen; oder es wird übersetzt, löst aber Constraint_Error aus; oder aber es wird anstandslos ausgeführt.

declare

  -- Der Elementtyp ist irrelevant.

  type T is array (Integer range <>) of ...;

  A: array (1..3) of ...;
  B: T (1..3);

begin                                -- Ada83  Ada95

  A := (1 => x, 2 .. 3 => y);        --   OK    OK
  A := (1 => x, others => y);        -- illegal OK  Neue Regel: Namentliche
  B := (1 => x, others => y);        -- illegal OK  Aggregate mit others
                                     --             gleiten nie!
  A := (0 => x, 1 .. 2 => y);        --   CE    CE  Grenzen nicht im
                                     --             Bereich  1..3.
  B := (0 => x, 1 .. 2 => y);        --   OK    OK  Grenzen sind im Bereich
                                     --             Integer und gleiten.
  A        := (3 => x, others => y); -- illegal OK  Neue Regel (s.o.),
  A (1..2) := (3 => x, others => y); -- illegal CE  aber obere Grenze ist
                                     --             außerhalb von 1..2.
  A        := (1 => x, 2 => y);      --   CE    CE  Falsche Grenzen.
  A (1..2) := (2 => x, 3 => y);      --   OK    OK  Grenzen gleiten.
  A (1..2) := (1 => x, others => y); -- illegal OK  Neue Regel (s.o.),
  A (1..2) := (2 => x, others => y); -- illegal OK  ditto.

  A        := (x, others => y);      --   OK    OK  Grenzen aus
  A (1..2) := (x, others => y);      --   OK    OK  Kontext.

  A := A (2..3) & A (1);             --   CE    OK  Weitere neue Regel,
  B := B (2..3) & B (1);             --   OK    OK  siehe unten.

end;

Wie man sieht, macht die neue Regel vieles einfacher, ohne alte Regeln aufzuheben. Was früher Constraint_Error auslöste, tut es auch weiterhin, dafür bewirken nun einige Zuweisungen, die früher illegal waren, genau das Offensichtliche. Besonders interessant sind die beiden letzten Zuweisungen. Dass die für A in Ada83 Constraint_Error auslöste, war wohl eine ungewollte Nebenwirkung: Der Ausdruck A (2..3) & A (1) hat nämlich die unzulässigen Grenzen 2 und 4. Eine neue Sonderregelung in Ada95 lässt ihn die richtigen Grenzen 1 und 3 annehmen.


Ada Magica
Inhaltsverzeichnis
       © Copyright 1998 C.K.W. Grein