Computerwissenschaften

So geben Sie mehrere Werte von einer Delphi-Funktion zurück

Ein am häufigsten verwendetes Konstrukt in einer Delphi- Anwendung ist eine Prozedur oder eine Funktion. Als Routinen, Prozeduren oder Funktionen bezeichnet, sind Anweisungsblöcke, die Sie von verschiedenen Stellen in einem Programm aus aufrufen.

Einfach ausgedrückt ist eine Prozedur eine Routine, die keinen Wert zurückgibt, während eine Funktion einen Wert zurückgibt.

Ein Rückgabewert einer Funktion wird durch den Rückgabetyp definiert. In den meisten Fällen würden Sie eine Funktion schreiben, um einen einzelnen Wert zurückzugeben , der eine Ganzzahl, eine Zeichenfolge, ein Boolescher Wert oder ein anderer einfacher Typ ist. Auch Rückgabetypen können ein Array, eine Zeichenfolgenliste, eine Instanz eines benutzerdefinierten Objekts oder ähnliches sein.

Beachten Sie, dass Ihre Funktion auch dann einen einzelnen Wert zurückgibt , wenn eine Zeichenfolgenliste (eine Sammlung von Zeichenfolgen. zurückgegeben wird: eine Instanz der Zeichenfolgenliste.

Außerdem können Delphi-Routinen wirklich viele Gesichter haben: Routine, Methode, Methodenzeiger, Ereignisdelegierter, anonyme Methode …

 

Kann eine Funktion mehrere Werte zurückgeben?

Die erste Antwort, die uns in den Sinn kommt, ist nein, einfach weil wir, wenn wir an eine Funktion denken, an einen einzelnen Rückgabewert denken.

Die Antwort auf die obige Frage lautet jedoch sicherlich Ja. Eine Funktion kann mehrere Werte zurückgeben. Mal sehen wie.

 

Var-Parameter

Wie viele Werte kann die folgende Funktion zurückgeben, einer oder zwei?


Funktion PositiveReciprocal ( const valueIn: integer; var valueOut: real): boolean;

Die Funktion gibt offensichtlich einen booleschen Wert zurück (wahr oder falsch). Wie wäre es mit dem zweiten Parameter „valueOut“, der als „VAR“ -Parameter (Variable) deklariert ist?

Var-Parameter werden als Referenz an die Funktion übergeben. Dies bedeutet, dass die Funktion den Wert der für den Parameter verwendeten Variablen ändert, wenn die Funktion den Wert des Parameters ändert – eine Variable im aufrufenden Codeblock.

Um zu sehen, wie das oben genannte funktioniert, ist hier die Implementierung:


Funktion PositiveReciprocal ( const valueIn: integer; var valueOut: real): boolean;

 

Start

 

 Ergebnis:=valueIn> 0;

 

 wenn Ergebnis dann valueOut:=1 / valueIn;

 

Ende ;

Das „valueIn“ wird als konstanter Parameter übergeben – die Funktion kann es nicht ändern und wird als schreibgeschützt behandelt.

Wenn „valueIn“ oder größer als Null ist, wird dem Parameter „valueOut“ der reziproke Wert von „valueIn“ zugewiesen, und das Ergebnis der Funktion ist wahr. Wenn valueIn <= 0 ist, gibt die Funktion false zurück und „valueOut“ wird in keiner Weise geändert.

Hier ist die Verwendung:


var

 

 b: Boolescher Wert;

 

 r: real;

 

Start

 

 r:=5;

 

 b:=PositiveReciprocal (1, r);

 

 //Hier:

 

 // b=wahr (da 1>=0)

 

 // r=0,2 (1/5)

 

 r:=5;

 

 b:=PositiveReciprocal (-1, r);

 

 //Hier:

 

 // b=false (seit -1 

 

Ende ;

Daher kann der PositiveReciprocal tatsächlich 2 Werte „zurückgeben“! Mit var-Parametern kann eine Routine mehr als einen Wert zurückgeben.

 

Out-Parameter

Es gibt eine andere Möglichkeit, einen Referenzparameter anzugeben: Verwenden Sie das Schlüsselwort „out“ wie folgt:


Funktion PositiveReciprocalOut ( const valueIn: integer; out valueOut: real): boolean;

 

Start

 

 Ergebnis:=valueIn> 0;

 

 wenn Ergebnis dann valueOut:=1 / valueIn;

 

Ende ;

Die Implementierung von PositiveReciprocalOut ist dieselbe wie in PositiveReciprocal, es gibt nur einen Unterschied: Der „valueOut“ ist ein OUT-Parameter.

Bei als „out“ deklarierten Parametern wird der Anfangswert der referenzierten Variablen „valueOut“ verworfen.

Hier ist die Verwendung und die Ergebnisse:


var

 

 b: Boolescher Wert;

 

 r: real;

 

Start

 

 r:=5;

 

 b:=PositiveReciprocalOut (1, r);

 

 //Hier:

 

 // b=wahr (da 1>=0)

 

 // r=0,2 (1/5)

 

 r:=5;

 

 b:=PositiveReciprocalOut (-1, r);

 

 //Hier:

 

 // b=false (seit -1 

 

Ende ;

Beachten Sie, wie beim zweiten Aufruf der Wert der lokalen Variablen „r“ auf „0“ gesetzt wird. Der Wert von „r“ wurde vor dem Funktionsaufruf auf 5 gesetzt, aber da der Parameter in als „out“ deklariert wurde, wurde der Wert verworfen, als „r“ die Funktion erreichte, und der Standardwert „leer“ wurde für den Parameter (0) gesetzt für echten Typ).

Infolgedessen können Sie sicher nicht initialisierte Variablen für out-Parameter senden – etwas, das Sie mit „var“ -Parametern nicht tun sollten. Parameter werden verwendet, um etwas an die Routine zu senden, außer hier mit „out“ -Parametern :), und daher können nicht initialisierte Variablen (die für VAR-Parameter verwendet werden) seltsame Werte haben.

 

Aufzeichnungen zurückgeben?

Die obigen Implementierungen, bei denen eine Funktion mehr als einen Wert zurückgeben würde, sind nicht nett. Die Funktion gibt tatsächlich einen einzelnen Wert zurück, gibt aber auch, besser gesagt, die Werte der var / out-Parameter zurück.

Aus diesem Grund möchten Sie möglicherweise nur sehr selten Referenzparameter verwenden. Wenn mehr Ergebnisse von einer Funktion erforderlich sind, kann eine Funktion eine Datensatztypvariable zurückgeben .

Folgendes berücksichtigen:


Art

 

TLatitudeLongitude=Datensatz

 

 Breitengrad: real;

 

 Längengrad: real;

 

 Ende ;

und eine hypothetische Funktion:


Funktion WhereAmI ( const townName: string ): TLatitudeLongitude;

Die Funktion WhereAmI würde den Breiten- und Längengrad für eine bestimmte Stadt (Stadt, Gebiet, …) zurückgeben.

Die Implementierung wäre:


Funktion WhereAmI ( const townName: string ): TLatitudeLongitude;

 

begin // benutze einen Dienst, um "townName" zu finden, und weise dann das Funktionsergebnis zu:

 

 Ergebnis.Latitude:=45,54;

 

 Ergebnis.Länge:=18,71;

 

Ende ;

Und hier haben wir eine Funktion, die 2 reelle Werte zurückgibt. Ok, es wird 1 Datensatz zurückgegeben, aber dieser Datensatz enthält 2 Felder. Beachten Sie, dass Sie einen sehr komplexen Datensatz haben können, der verschiedene Typen mischt, die als Ergebnis einer Funktion zurückgegeben werden sollen.

Das ist es. Daher können Delphi-Funktionen mehrere Werte zurückgeben.

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.