Harbour Handbuch – DE
HTML-Ausgabe

Kapitel 4: Kontrollstrukturen

In Harbour, wie in den meisten Programmiersprachen, sind Kontrollstrukturen grundlegend, um den Ausführungsfluss eines Programms zu steuern. Sie erlauben es, Entscheidungen zu treffen, Aktionen zu wiederholen und Code-Sequenzen auf geordnete Weise zu handhaben.

Bedingte Anweisungen

Bedingte Anweisungen führen Codeblöcke nur aus, wenn bestimmte Bedingungen erfüllt sind.

IF, ELSEIF, ELSE, ENDIF

Dies ist die gebräuchlichste bedingte Struktur. Sie erlaubt die Ausführung verschiedener Codeblöcke basierend auf einer oder mehreren logischen Bedingungen.

**Syntax:**


IF <logischeBedingung1>
   // Codeblock, wenn logischeBedingung1 wahr (.T.) ist
[ELSEIF <logischeBedingung2>]
   // Codeblock, wenn logischeBedingung2 wahr (.T.) ist
[ELSE]
   // Codeblock, wenn keine der vorherigen Bedingungen wahr ist
ENDIF

**Beispiel:**


PROCEDURE UeberpruefeAlter( nAlter )
   IF nAlter >= 18
      ? "Volljährig."
   ELSE
      ? "Minderjährig."
   ENDIF
RETURN

SWITCH

Die SWITCH-Struktur ist nützlich, wenn eine einzelne Variable oder ein Ausdruck mit einer Reihe möglicher Werte verglichen werden muss. Sie ist eine lesbarere Alternative zu einer Reihe von IF...ELSEIF.

**Syntax:**


SWITCH <ausdruck>
   CASE <wert1>
      // Codeblock, wenn der Ausdruck gleich wert1 ist
      [EXIT] // Optional, beendet das SWITCH
   CASE <wert2>
      // Codeblock, wenn der Ausdruck gleich wert2 ist
      [EXIT]
   [OTHERWISE]
      // Codeblock, wenn der Ausdruck mit keinem CASE übereinstimmt
ENDSWITCH

*Hinweis: Im Gegensatz zu anderen Sprachen setzt die Ausführung beim nächsten CASE fort, wenn EXIT nicht verwendet wird.*

**Beispiel:**


FUNCTION Wochentag( nTag )
   LOCAL cTag := ""
   SWITCH nTag
      CASE 1
         cTag := "Montag"
      CASE 2
         cTag := "Dienstag"
      CASE 3
         cTag := "Mittwoch"
      // ... andere Tage
      OTHERWISE
         cTag := "Ungültiger Tag"
   ENDSWITCH
RETURN cTag

Schleifen

Schleifen erlauben die wiederholte Ausführung eines Codeblocks.

DO WHILE

Diese Schleife wiederholt einen Codeblock, solange eine Bedingung wahr ist. Die Bedingung wird zu Beginn der Schleife ausgewertet.

**Syntax:**


DO WHILE <logischeBedingung>
   // Codeblock, der wiederholt wird
   [LOOP]   // Springt zum Anfang von DO WHILE
   [EXIT]   // Beendet die Schleife
ENDDO

**Beispiel:**


PROCEDURE ZaehleBisFuenf()
   LOCAL nZaehler := 1
   DO WHILE nZaehler <= 5
      ? nZaehler
      nZaehler++
   ENDDO
RETURN

FOR...NEXT

Diese Schleife wird verwendet, um einen Codeblock eine bestimmte Anzahl von Malen zu wiederholen. Ideal für die Iteration mit einem Zähler.

**Syntax:**


FOR <variable> := <start> TO <ende> [STEP <inkrement>]
   // Codeblock, der wiederholt wird
   [LOOP]   // Springt zur nächsten Iteration
   [EXIT]   // Beendet die Schleife
NEXT

**Beispiel:**


PROCEDURE EinmaleinsZwei()
   LOCAL nZahl
   FOR nZahl := 1 TO 10
      ? "2 x", nZahl, "=", 2 * nZahl
   NEXT
RETURN

FOR EACH

Diese Schleife ist dafür entworfen, über die Elemente einer Sammlung zu iterieren, wie z.B. ein Array oder ein Hash.

**Syntax:**


FOR EACH <variable> IN <sammlung>
   // Codeblock, der für jedes Element ausgeführt wird
   // Die <variable> nimmt den Wert jedes Elements in jeder Iteration an
   [LOOP]   // Springt zur nächsten Iteration
   [EXIT]   // Beendet die Schleife
NEXT

**Beispiel:**


PROCEDURE ZeigeFarben()
   LOCAL aFarben := { "Rot", "Grün", "Blau" }
   LOCAL cFarbe

   FOR EACH cFarbe IN aFarben
      ? cFarbe
   NEXT
RETURN

Sequenz-Handler

BEGIN SEQUENCE...END

Diese Struktur bietet einen Mechanismus zur Fehlerbehandlung oder zum kontrollierten Verlassen einer verschachtelten Code-Sequenz, ähnlich den `try...catch`-Blöcken in anderen Sprachen.

**Syntax:**


BEGIN SEQUENCE
   // Hauptcode der Sequenz
   [BREAK] // Unterbricht die Sequenz
[RECOVER [USING <fehlerVariable>]]
   // Wiederherstellungscode, der nach einem BREAK ausgeführt wird
END SEQUENCE

**Beispiel für Fehlerbehandlung:**


FUNCTION Dividiere( nZaehler, nNenner )
   LOCAL nErgebnis

   BEGIN SEQUENCE
      IF nNenner == 0
         // Division durch Null nicht möglich, breche Sequenz ab
         BREAK
      ENDIF
      nErgebnis := nZaehler / nNenner
   RECOVER
      // Wenn ein BREAK auftrat, weise einen Standardwert zu
      nErgebnis := 0
      ? "Fehler: Division durch Null."
   END SEQUENCE

RETURN nErgebnis