Funktionen und Prozeduren sind die grundlegenden Bausteine jedes Harbour-Programms. Sie erlauben es, Code in logische, wiederverwendbare und leicht wartbare Einheiten zu organisieren. In diesem Kapitel werden wir untersuchen, wie man Funktionen definiert und verwendet, den Unterschied zwischen ihnen und Prozeduren, wie man Parameter handhabt und einige der wichtigsten Hilfsfunktionen.
In Harbour werden sowohl PROCEDURE
als auch FUNCTION
verwendet, um Unterprogramme zu definieren. Obwohl sie sehr ähnlich sind, liegt der Hauptunterschied konzeptionell darin, ob sie einen Wert zurückgeben oder nicht.
// Definiere eine Funktion, die zwei Zahlen addiert und das Ergebnis zurückgibt
FUNCTION Summe( n1, n2 )
LOCAL nErgebnis
nErgebnis := n1 + n2
RETURN nErgebnis
// Rufe die Funktion auf und speichere den zurückgegebenen Wert
LOCAL nMeineSumme
nMeineSumme := Summe( 5, 10 ) // nMeineSumme enthält 15
? nMeineSumme
// Definiere eine Prozedur, um einen Gruß anzuzeigen
PROCEDURE Gruesse( cName )
? "Hallo, " + cName + "!"
RETURN
// Rufe die Prozedur auf
Gruesse( "Welt" ) // Gibt "Hallo, Welt!" aus
**Wesentliche Erkenntnis:** Im modernen Harbour ist die Unterscheidung hauptsächlich semantisch. Du kannst FUNCTION
für alles verwenden und einfach den `RETURN`-Wert weglassen, wenn er nicht benötigt wird. Die Verwendung von PROCEDURE
kann jedoch die Absicht klären, dass ein Unterprogramm kein Ergebnis zurückgeben soll.
Parameter sind lokale Variablen, die die Werte (Argumente) empfangen, die an eine Funktion oder Prozedur übergeben werden.
FUNCTION ModifiziereWert( nWertPerRef, nWertPerCopy )
nWertPerRef += 100 // Modifiziert das Original
nWertPerCopy += 100 // Modifiziert nur die lokale Kopie
RETURN NIL
LOCAL nA := 10, nB := 10
? "Ursprüngliche Werte:", nA, nB // Gibt aus: 10, 10
ModifiziereWert( @nA, nB ) // nA wird per Referenz, nB per Wert übergeben
? "Modifizierte Werte:", nA, nB // Gibt aus: 110, 10
FUNCTION Nachricht( cText, cTitel )
IF PCOUNT() < 2
cTitel := "Hinweis" // Weist einen Standardwert zu, wenn kein Titel übergeben wurde
ENDIF
? cTitel + ": " + cText
RETURN NIL
Nachricht( "Vorgang abgeschlossen." ) // Gibt aus: "Hinweis: Vorgang abgeschlossen."
Nachricht( "Schwerwiegender Fehler.", "Fehler" ) // Gibt aus: "Fehler: Schwerwiegender Fehler."
E/A-Funktionen sind essentiell für die Interaktion mit dem Benutzer. Harbour bietet einen Satz einfacher Funktionen für die Handhabung der Konsole.
LOCAL cName
// Fragt den Benutzer nach dem Namen
ACCEPT "Bitte gib deinen Namen ein: " TO cName
// Begrüßt den Benutzer
? "Willkommen,", cName
// Wartet auf einen Tastendruck zum Beenden
WAIT "Drücke eine beliebige Taste, um fortzufahren..."
Harbour enthält einen umfangreichen Satz eingebauter Funktionen, die Informationen über den Programmzustand und die verarbeiteten Daten liefern.
FUNCTION MeineRoutine( xParameter )
LOCAL cDatentyp
// Holt den Namen der aktuellen Funktion
? "Führe Funktion aus:", PROCNAME()
// Validiert den Typ des Parameters
cDatentyp := VALTYPE( xParameter )
IF cDatentyp == "C"
? "Der Parameter ist eine Zeichenkette:", xParameter
ELSEIF cDatentyp == "N"
? "Der Parameter ist eine Zahl:", xParameter
ELSE
? "Der Parameter hat einen unerwarteten Typ:", cDatentyp
ENDIF
RETURN NIL
// Beispielaufrufe
MeineRoutine( "Hallo" )
MeineRoutine( 123.45 )
MeineRoutine( .T. )