Euphorie - Flusskontrolle

Der Programmausführungsfluss bezieht sich auf die Reihenfolge, in der Programmanweisungen ausgeführt werden. Standardmäßig werden die Anweisungen nacheinander ausgeführt.

Jedoch; Oft muss die Ausführungsreihenfolge von der Standardreihenfolge geändert werden, um die Aufgabe zu erledigen.

Euphoria verfügt über eine Reihe von Flusssteuerungsanweisungen , mit denen Sie die Ausführungsreihenfolge von Anweisungen festlegen können.

Die exit- Anweisung

Das Beenden einer Schleife erfolgt mit dem Schlüsselwort exit. Dies führt dazu, dass der Fluss die aktuelle Schleife sofort verlässt und mit der ersten Anweisung nach dem Ende der Schleife beginnt.

Syntax

Die Syntax einer exit-Anweisung lautet wie folgt:

exit [ "Label Name" ] [Number]

Das exit Die Anweisung beendet die letzte und innerste Schleife, bis ein optionaler Markenname oder eine optionale Nummer angegeben wird.

Eine besondere Form von exit N ist exit 0. Dadurch bleiben alle Schleifenebenen unabhängig von der Tiefe. Die Steuerung wird nach dem äußersten Schleifenblock fortgesetzt. Ebenso verlässt exit -1 die zweite äußerste Schleife und so weiter.

Beispiel

#!/home/euphoria-4.0b2/bin/eui

integer b

for a = 1 to 16 do
   printf(1, "value of a %d\n", a)
   
   if a = 10 then
      b = a
      exit
   end if
end for

printf(1, "value of b %d\n", b)

Dies ergibt das folgende Ergebnis:

value of a 1
value of a 2
value of a 3
value of a 4
value of a 5
value of a 6
value of a 7
value of a 8
value of a 9
value of a 10
value of b 10

Die break- Anweisung

Das break Anweisung funktioniert genau wie die exit Anweisung, gilt jedoch eher für if-Anweisungen oder switch-Anweisungen als für Schleifenanweisungen jeglicher Art.

Syntax

Die Syntax der break-Anweisung lautet wie folgt:

break [ "Label Name" ] [Number]

Das break Die Anweisung beendet den neuesten und innersten if- oder switch-Block, bis ein optionaler Beschriftungsname oder eine optionale Nummer angegeben wird.

Eine besondere Form von break N ist break 0. Dies lässt den äußersten if- oder switch-Block unabhängig von der Tiefe. Die Steuerung wird nach dem äußersten Block fortgesetzt. Ebenso bricht break -1 den zweiten äußersten if- oder switch-Block und so weiter.

Beispiel

#!/home/euphoria-4.0b2/bin/eui

integer a, b
sequence s = {'E','u', 'p'}

if s[1] = 'E' then
   a = 3
   
   if s[2] = 'u' then
      b = 1
      if s[3] = 'p' then
         break 0 -- leave topmost if block
      end if
      a = 2
   else
      b = 4
   end if
else
   a = 0
   b = 0
end if

printf(1, "value of a %d\n", a)
printf(1, "value of b %d\n", b)

Dies ergibt das folgende Ergebnis:

value of a 3
value of b 1

Die continue- Anweisung

Das continue Die Anweisung setzt die Ausführung der Schleife fort, für die sie gilt, indem sie zur nächsten Iteration wechselt und den Rest einer Iteration überspringt.

Um zur nächsten Iteration zu gelangen, müssen Sie einen Index für Bedingungsvariablen testen und prüfen, ob er noch innerhalb der Grenzen liegt.

Syntax

Die Syntax der continue-Anweisung lautet wie folgt:

continue [ "Label Name" ] [Number]

Das continue Die Anweisung würde die letzte und innerste Schleife wiederholen, bis ein optionaler Markenname oder eine optionale Nummer angegeben wird.

Eine besondere Form von continue N ist continue 0. Dadurch wird die äußerste Schleife unabhängig von der Tiefe wiederholt. Ebenso beginnt -1 weiter ab der zweiten äußersten Schleife und so weiter.

Beispiel

#!/home/euphoria-4.0b2/bin/eui

for a = 3 to 6 do
   printf(1, "value of a %d\n", a)

   if a = 4 then
      puts(1,"(2)\n")
      continue
   end if

   printf(1, "value of a %d\n", a*a)
end for
This would produce following result:

value of a 3
value of a 9
value of a 4
(2)
value of a 5
value of a 25
value of a 6
value of a 36

Die Wiederholungs Aussage

Das retry Die Anweisung setzt die Ausführung der Schleife fort, für die sie gilt, indem sie zur nächsten Iteration wechselt und den Rest einer Iteration überspringt.

Syntax

Die Syntax der retry-Anweisung lautet wie folgt:

retry [ "Label Name" ] [Number]

Das retryDie Anweisung versucht erneut, die aktuelle Iteration der Schleife auszuführen, für die sie gilt. Die Anweisung verzweigt zur ersten Anweisung der angegebenen Schleife und testet weder etwas noch erhöht sie den for-Schleifenindex.

Eine besondere Form von retry N ist retry 0. Dies versucht erneut, die äußerste Schleife auszuführen, unabhängig von der Tiefe. Ebenso versucht retry -1 die zweite äußerste Schleife und so weiter.

Normalerweise enthält ein Unterblock, der eine Wiederholungsanweisung enthält, auch ein anderes Schlüsselwort für die Flusssteuerung, z. B. exit, continue oder break. Andernfalls würde die Iteration endlos ausgeführt.

Beispiel

#!/home/euphoria-4.0b2/bin/eui

integer errors = 0
integer files_to_open = 10

for i = 1 to length(files_to_open) do
   fh = open(files_to_open[i], "rb")
   
   if fh = -1 then
      if errors > 5 then
         exit
      else
         errors += 1
         retry
      end if
   end if
   file_handles[i] = fh
end for

Da retry den Wert von i nicht ändert und erneut versucht, dieselbe Datei zu öffnen, muss es eine Möglichkeit geben, aus der Schleife auszubrechen, die die exit-Anweisung bereitstellt.

Die goto-Anweisung

Das goto Die Anweisung weist den Computer an, die Codeausführung an einer gekennzeichneten Stelle fortzusetzen.

Der Ort, an dem die Ausführung fortgesetzt werden soll, wird als Ziel der Anweisung bezeichnet. Es ist beschränkt, in der aktuellen Routine oder in der aktuellen Datei zu liegen, wenn diese außerhalb einer Routine liegt.

Syntax

Die Syntax der goto-Anweisung lautet wie folgt:

goto "Label Name"

Das Ziel einer goto-Anweisung kann beliebig zugänglich sein label Aussage -

label "Label Name"

Beschriftungsnamen müssen konstante Zeichenfolgen in doppelten Anführungszeichen sein. Zeichen, die in Euphoria-Kennungen unzulässig sind, werden möglicherweise in einem Labelnamen angezeigt, da es sich um eine reguläre Zeichenfolge handelt.

Beispiel

#!/home/euphoria-4.0b2/bin/eui

integer a = 0

label "FIRST"
printf(1, "value of a %d\n", a)
a += 10

if a < 50 then
   goto "FIRST"
end if 
printf(1, "Final value of a %d\n", a)

Dies ergibt das folgende Ergebnis:

value of a 0
value of a 10
value of a 20
value of a 30
value of a 40
Final value of a 50