Autor |
Beitrag |
DK99
Beiträge: 46
Win Vista (64 Bit) + W7 Up
(Delphi 7,) Java 6 (Eclipse+ BlueJ), OpenGL2.0
|
Verfasst: Do 13.11.08 17:28
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.
_________________ "Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."-- Dan Salomon
|
|
Marc.
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Do 13.11.08 17: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; |
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 13.11.08 17:41
|
|
Marc.
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Do 13.11.08 18:05
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 13.11.08 18:45
[OT] Tröste Dich, passiert mir auch gelegentlich [/OT]
|
|
martin300
Beiträge: 186
Erhaltene Danke: 2
|
Verfasst: Fr 14.11.08 10: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
Beiträge: 46
Win Vista (64 Bit) + W7 Up
(Delphi 7,) Java 6 (Eclipse+ BlueJ), OpenGL2.0
|
Verfasst: Fr 14.11.08 15: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?
_________________ "Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."-- Dan Salomon
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 14.11.08 15:58
Du übergibst ja 2 Variablen als Parameter an die Funktion. Anschließend haben sie ja dann ggf. geänderte Werte.
|
|
DK99
Beiträge: 46
Win Vista (64 Bit) + W7 Up
(Delphi 7,) Java 6 (Eclipse+ BlueJ), OpenGL2.0
|
Verfasst: Fr 14.11.08 16: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!
_________________ "Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."-- Dan Salomon
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 14.11.08 16: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
Beiträge: 46
Win Vista (64 Bit) + W7 Up
(Delphi 7,) Java 6 (Eclipse+ BlueJ), OpenGL2.0
|
Verfasst: Fr 14.11.08 18: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
_________________ "Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."-- Dan Salomon
|
|
jaenicke
Beiträge: 19288
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 14.11.08 18: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:
www.delphi-forum.de/....php?p=533109#533109
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 23.11.08 01:14
Bitte Beachten: var und out Unterscheiden sich. Reine Rückgabe wäre out, für var muss die übergebene Variable initialisiert werden.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 23.11.08 11: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.
|
|