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;
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
DeddyH hat folgendes geschrieben : |
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!