Harbour Handbuch – DE
HTML-Ausgabe

Kapitel 3: Funktionen

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.


Prozeduren (`PROCEDURE`) vs. Funktionen (`FUNCTION`)

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 und Argumente

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."

Ein-/Ausgabe-Funktionen (E/A)

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..."

Hilfsfunktionen (`VALTYPE()`, `PROCNAME()`)

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. )