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 führen Codeblöcke nur aus, wenn bestimmte Bedingungen erfüllt sind.
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
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 erlauben die wiederholte Ausführung eines Codeblocks.
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
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
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
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