|
6.8 Goto-Anweisung
Die Goto-Anweisung (goto_statement
<BNF>) ist eine allgemeine Sprunganweisung, mit der man nicht
nur Schleifen verlassen, sondern auch an andere Stellen eines Ada-Programmes
verzweigen kann.
goto Name_Sprungmarke;
...
<<Name_Sprungmarke>>
...
Argument einer Goto-Anweisung ist der Name einer Sprungmarke, die vor der Anweisung
(Zielanweisung) stehen muß, zu der gesprungen werden soll.
Die Programmausführung wird anschließend mit der Zielanweisung fortgesetzt.
In Ada gelten folgende Regeln für die Implementierung von Goto-Anweisungen:
- Die Stelle, zu der mit "goto" gesprungen wird, muß dem gleichen oder
einem höheren Programmlevel angehören wie die Stelle, wo sich das "goto"
befindet.
So darf z. B. aus dem Then-Teil einer If-Anweisung an den Anfang der If-Anweisung
gesprungen werden, aber nicht vom Anfang der If-Anweisung in den Then-Teil.
- Es darf nicht aus der Anweisungsfolge eines "accept" herausgesprungen werden.
Wenn eine Goto-Anweisung in einer Accept-Anweisung enthalten ist, darf die Zielanweisung
nicht außerhalb der Accept-Anweisung liegen.
- Wenn eine Goto-Anweisung in einem Rumpf (eines Unterprogramms, Paketes, Prozesses
oder geschützten Typs) enthalten ist, darf die Zielanweisung nicht außerhalb
des Rumpfes liegen.
- Sprünge zwischen den Alternativen einer If-Anweisung, Case-Anweisung,
Select-Anweisung oder eines Ausnahmebehandlers sind nicht erlaubt.
- Aus der Anweisungsfolge eines Ausnahmebehandlers darf nicht in die Anweisungsfolge,
die diese Ausnahme ausgelöst hat, zurückgesprungen werden.
- Es darf nur an den Anfang einer Steueranweisung (If-, Case-, Loop- oder Accept-Anweisung)
gesprungen werden.
- Es darf nicht in den Rumpf eines Unterprogrammes, Paketes, Prozesses oder
geschützten Typs hineingesprungen werden.
Beispiel:
-- goto-Lösung
Sprung aus dem Then-Teil einer If-Anweisung vor die For-Schleife mit goto
<<SORTIERE>> -- Sprungmarke
for I in 1..ZAHL_ELEMENTE-1 loop
if A(I) > A(I+1) then
VERTAUSCHE(A(I), A(I+1));
goto SORTIERE; -- Verzweigen
zu <<SORTIERE>>
end if;
end loop; |
-- Lösung ohne goto
Entsprechender Programmablauf ohne Goto-Anweisung
I:=1;
while I <= ZAHL_ELEMENTE - 1 loop
if A(I) > A(I+1) then
VERTAUSCHE(A(I), A(I+1));
I:=1;
else
I:=I+1;
end if;
end loop; |
Auf die Verwendung von Goto-Anweisungen sollte nach Möglichkeit verzichtet
werden, da sich der Programmablauf ohne "goto" transparenter gestalten
läßt und das Programm besser lesbar und wartbar ist.
|