6. Anweisungen
 
zurück
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.


 
zurück
 Index   Ada Tour - Dokumentation  
© 2003 Förderverein Ada Deutschland e.V.