Autor Beitrag
DK99
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46

Win Vista (64 Bit) + W7 Up
(Delphi 7,) Java 6 (Eclipse+ BlueJ), OpenGL2.0
BeitragVerfasst: Do 13.11.08 18: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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Do 13.11.08 18:39 
Was sind das für Werte?
Meinst Du sowas?
ausblenden 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;
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 13.11.08 18:41 
Das hier wird aber nicht funktionieren:
Zitat:
ausblenden Delphi-Quelltext
1:
function Foo(var a: Integer; var b: String);					
;)
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Do 13.11.08 19:05 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Das hier wird aber nicht funktionieren:
Zitat:
ausblenden 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
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 13.11.08 19:45 
[OT] Tröste Dich, passiert mir auch gelegentlich :lol: [/OT]
martin300
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 186
Erhaltene Danke: 2



BeitragVerfasst: Fr 14.11.08 11:34 
Die Rückgabe mit 'Call by Reference' ist eine ganz tolle Sache.

Angenommen du schreibst dir folgende Prozedur:
ausblenden 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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46

Win Vista (64 Bit) + W7 Up
(Delphi 7,) Java 6 (Eclipse+ BlueJ), OpenGL2.0
BeitragVerfasst: 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:
ausblenden 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46

Win Vista (64 Bit) + W7 Up
(Delphi 7,) Java 6 (Eclipse+ BlueJ), OpenGL2.0
BeitragVerfasst: 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!

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



BeitragVerfasst: Fr 14.11.08 17:40 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46

Win Vista (64 Bit) + W7 Up
(Delphi 7,) Java 6 (Eclipse+ BlueJ), OpenGL2.0
BeitragVerfasst: 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

_________________
"Sometimes it pays to stay in bed on Monday, rather than spending the rest of
the week debugging Monday's code."-- Dan Salomon
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19135
Erhaltene Danke: 1707

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
www.delphi-forum.de/....php?p=533109#533109
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
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



BeitragVerfasst: 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.