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 |