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 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 (s.o.),
A (1..2) := (3 => x, others => y); -- illegal CE
-- .
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 (s.o.),
A (1..2) := (2 => x, others => y); -- illegal OK .
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 |