Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Funktion mit zwei Rückgabewerten


DK99 - Do 13.11.08 18:28
Titel: Funktion mit zwei Rückgabewerten
Hey
Ich hab mal ne ganz blöde Frage:
Kann eine Funktion zwei Werte(oder auch mehr) zurückgeben und wenn ja wie?
Ich kenne bis jetzt nur die Möglichkeit reslut := ergebnis
um dass dann in dem eigentlichen Projekt aufzurufen.
Würd mich über ne schnelle Antwort freun, ich brauch das dringend bei meinem OpenGL Projekt.
MFG und danke schonmal für die antworten.


Marc. - Do 13.11.08 18:39

Was sind das für Werte?
Meinst Du sowas?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
type
  TResult = record
     Num : Integer;
     Text: String;
  end;

type
  TResList: Array of Integer;

// Rückgabe durch Call-By-Reference bzw. durch Record / Array:
function Foo(var a: Integer; var b: String);
procedure Foo (out a: Integer; out b: String);
function Foo: TResult;
function Foo: TStrings;
function Foo: TResList;

... result.Num := 10;


Delete - Do 13.11.08 18:41

Das hier wird aber nicht funktionieren:
Zitat:

Delphi-Quelltext
1:
function Foo(var a: Integer; var b: String);                    
;)


Marc. - Do 13.11.08 19:05

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Das hier wird aber nicht funktionieren:
Zitat:

Delphi-Quelltext
1:
function Foo(var a: Integer; var b: String);                    
;)

Klar, müsste in diesem Fall eine Procedure sein. Kommt davon, wenn man seinen Text nicht noch einmal genau durchließt vorm Absenden. :P


Delete - Do 13.11.08 19:45

[OT] Tröste Dich, passiert mir auch gelegentlich :lol: [/OT]


martin300 - Fr 14.11.08 11:34

Die Rückgabe mit 'Call by Reference' ist eine ganz tolle Sache.

Angenommen du schreibst dir folgende Prozedur:

Quelltext
1:
procedure ziffer1Um2ErhoehenUndZiffer2Um9Erhoehen (var ziffer1 : Integer; var ziffer2: Integer);                    

und bei jedem Aufruf der Prozedur erhöht sich ziffer1 um 1 und ziffer2 um 9. Wenn du hingegen

Quelltext
1:
procedure ziffer1Um2ErhoehenUndZiffer2Um9Erhoehen (ziffer1 : Integer; ziffer2: Integer);                    

schreibst wird nur der interne Wert verändert (Call by Value). Ist vom Code zwar nur eine Kleinigkeit ändert aber sehr viel am Ergebnis.


DK99 - Fr 14.11.08 16:48

OK also wenn ich euch jetzt richtig verstanden hab muss man so eine Funktion so schreiben damit die angenommenen Variablen verändert und wieder zurückgegeben werden können:

Delphi-Quelltext
1:
function irgentwas(var x,y: Integer;);                    

Stimmt das?
Wenn ja wie kann ich diese beiden Werte dann abfragen?


Delete - Fr 14.11.08 16:58

Du übergibst ja 2 Variablen als Parameter an die Funktion. Anschließend haben sie ja dann ggf. geänderte Werte.


DK99 - Fr 14.11.08 17:38

Ja aber wenn ich diese Funktion jetzt in einer Unit habe und sie in einer anderen Unit aufrufe dann klappt das ja nicht. Und dafür bräuchte ich irgentwas um diese beiden Variablen eben auch in der anderen Unit auslesen zu können!


Delete - Fr 14.11.08 17:40


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
unit Blubb;

interface

uses ...;

procedure Foo(var a,b: integer);

implementation

procedure Foo(var a,b: integer);
begin
  a := a shl 1;
  b := a -3;
end;


So kannst Du die Prozedur von jeder Unit aus aufrufen, die die Unit Blubb benutzt.


DK99 - Fr 14.11.08 19:03

Ja, wenn ich jetzt aber in der UNit in der die Funktion aufgerufen werden soll zwei Vatiablen x un y habe un dich diese mit der unktion aus der anderen Unit verändern möchte, wie geht das?
Ich hoffe ihr könnt mich verstehen...wenn nicht dan nschreibt nochmal dann stell ich einfach ma lden Quelltext rein


jaenicke - Fr 14.11.08 19:19

Wir haben es verstanden ;-). Wir müssen es nur noch dir erklären ;-).

Diese Werte werden ja dann in der Funktion in der anderen Unit verändert. Du greifst dort auf die als Parameter übergebenen Variablen zu. Wie diese in deiner ursprünglichen Unit heißen muss deine Funktion dann gar nicht wissen, denn die Variablen, in die die Werte geschrieben werden sollen, werden ja an die Funktion übergeben.

Ein kleines Beispiel habe ich vor kurzem hier gepostet:
http://www.delphi-forum.de/viewtopic.php?p=533109#533109


BenBE - So 23.11.08 02:14

Bitte Beachten: var und out Unterscheiden sich. Reine Rückgabe wäre out, für var muss die übergebene Variable initialisiert werden.


Delete - So 23.11.08 12:32

Das ist so nicht ganz korrekt (wobei natürlich die komischsten Effekte auftreten, wenn man die Initialisierung vergisst). In C# bekommst Du allerdings einen Compilerfehler, wenn var-Parameter nicht initialisiert sind.