AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

function mit zwei Rückgabewerten?

Ein Thema von Hansi · begonnen am 24. Aug 2006 · letzter Beitrag vom 24. Aug 2006
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#11

Re: function mit zwei Rückgabewerten?

  Alt 24. Aug 2006, 12:43
Zitat von Hansi:
Nur wird diese 2x durchlaufen.
Wie kann ich das verhindern?
Zitat von 3_of_8:
Delphi-Quellcode:
with test(Edit1.Text) do
begin
  s := test_String;
  i := test_Integer;
end;
Also with ... do finde ich nicht soo toll, da kann man fix mal durcheinander kommen
Besser wäre (vorallem wenn noch mehr mit dem Ergebnis gearbeitet wird):
Delphi-Quellcode:
var Ergebnis: TTest;
...
Ergebnis := test(Edit1.Text);
s := Ergebnis.test_String;
i := Ergebnis.test_Integer;
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#12

Re: function mit zwei Rückgabewerten?

  Alt 24. Aug 2006, 12:49
Ihr castet einen string auf einen record? find ich jetzt sehr gewagt...

EDIT: uppsala... sorry, verlesen
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von ---Bernhard---
---Bernhard---

Registriert seit: 26. Dez 2003
Ort: Abensberg
111 Beiträge
 
Delphi 2006 Professional
 
#13

Re: function mit zwei Rückgabewerten?

  Alt 24. Aug 2006, 12:52
Hi!

Muss kurz was richtig stellen
Zitat von Neutral General:
1. Function gibt ein Record zurück

Delphi-Quellcode:
ABC = record
 A: String
 B: Integer;
 C: Boolean;
end;

function GetaABC: ABC;
begin
 ABC.A := 'Hallo';
 ABC.B := 22;
 ABC.C := true;
end;
Du musst 'result' verwenden:
Delphi-Quellcode:
ABC = record
  A: String
  B: Integer;
  C: Boolean;
end;

function GetABC: ABC;
begin
  result.A := 'Hallo';
  result.B := 22;
  result.C := true;
end;
Und dann hätte ich noch nen kleinen Vorschlag um das Zwischenspeichern des Records zu vermeiden, nämlich die Verwendung von "with .. do .." :

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with GetABC do
  begin
    showmessage(A);
    showmessage(IntToStr(B));
    showmessage(BoolToStr(C, true));
  end;
end;
edit: ups, der with do Vorschlag hatte ja schon jemand gepostet
Bernhard Doll
Das Leben ist ein sch*** Spiel... aber eine super Grafik!!
http://www.doll-online.net
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#14

Re: function mit zwei Rückgabewerten?

  Alt 24. Aug 2006, 12:56
Zitat von 3_of_8:
Delphi-Quellcode:
with test(Edit1.Text) do
begin
  s := test_String;
  i := test_Integer;
end;
Das mit dem with macht die ganze Sache noch unübersichtlicher.
Und die Funktion wird trotzdem 2x durchlaufen, weil 2x darauf zugrgriffen wird.

Die beste Lösung bisher ist das mit dem Ergebnis := ...
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#15

Re: function mit zwei Rückgabewerten?

  Alt 24. Aug 2006, 13:04
Zitat von RavenIV:
Zitat von 3_of_8:
Delphi-Quellcode:
with test(Edit1.Text) do
begin
  s := test_String;
  i := test_Integer;
end;
Und die Funktion wird trotzdem 2x durchlaufen, weil 2x darauf zugrgriffen wird.
Ich wette dagegen, ich glaube, Delphi legt eine Variable an, mit dem Inhalt und greift immer darauf zu ...
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#16

Re: function mit zwei Rückgabewerten?

  Alt 24. Aug 2006, 13:06
Zitat von RavenIV:
Das mit dem with macht die ganze Sache noch unübersichtlicher.
Und die Funktion wird trotzdem 2x durchlaufen, weil 2x darauf zugrgriffen wird.
Nee, ganz sicher nicht. with ist mehr eine Hilfe beim programmieren, der Compiler schert sich (grob gesehn) so gut wie gar nicht drum, ob da jetzt ein with steht oder ned. Fuer ihn ist es beides mal das selbe. Naemlich wird das Ergebnis auf den Stack gepusht, und er greift dann ueber [esp+offset] auf die einzelnen Elemente zu.

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von ManuMF
ManuMF

Registriert seit: 11. Jul 2005
1.016 Beiträge
 
Delphi 6 Personal
 
#17

Re: function mit zwei Rückgabewerten?

  Alt 24. Aug 2006, 13:06
@RavenIV: genau.
Hier noch mal dazu mein Code von oben:

Zitat von ManuMF:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Rueckgabe: TStringAndInt;
begin
  Rueckgabe := Test;
  Showmessage(Rueckgabe.rString + ' ' + IntToStr(Rueckgabe.rInteger));
end;
Gruß,
ManuMF

Endlich hab ich was Positives an Vista entdeckt: Das mitgelieferte Mahjongg
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: function mit zwei Rückgabewerten?

  Alt 24. Aug 2006, 13:19
Zitat von RavenIV:
Zitat von 3_of_8:
Delphi-Quellcode:
with test(Edit1.Text) do
begin
  s := test_String;
  i := test_Integer;
end;
Das mit dem with macht die ganze Sache noch unübersichtlicher.
Und die Funktion wird trotzdem 2x durchlaufen, weil 2x darauf zugrgriffen wird.

Die beste Lösung bisher ist das mit dem Ergebnis := ...
Unsinn.

Delphi-Quellcode:
with test('wuppdi') do
begin
showmessage(inttostr(i));
showmessage(s);
end;
wird zu:
Delphi-Quellcode:
lea edx,[ebp-$08]
mov eax,$004521b8
call test
lea edx,[ebp-$0c]
mov eax,[ebp-$04]
call IntToStr
mov eax,[ebp-$0c]
call ShowMessage
mov eax,[ebp-$08]
call ShowMessage
No further comment.
Manuel Eberl
  Mit Zitat antworten Zitat
oldmax

Registriert seit: 27. Apr 2006
Ort: Gieboldehausen
167 Beiträge
 
#19

Re: function mit zwei Rückgabewerten?

  Alt 24. Aug 2006, 13:26
Hi
Ich hatte keine Lust, jede Antwort auszuwerten, aber im Prinzip hab ich's schon durchgeschaut. Der Nachteil der Parameterübergabe mit Vatist, das du sehr schnell eine Variable veränderst, die du gar nicht geändert haben möchtest. Daher hier mal eine andere Lösung.

Delphi-Quellcode:
Function MyForm.Machwas(String_A : String): String;
Var String_B : String;
     Zahl : Integer;
begin
  .... machwas mit String_A ......
  .... setze String_B und den Wert der Zahl
  Result:=String_B+';'+IntToStr(Zahl);
end;
Aufruf im Programm
Delphi-Quellcode:
.....
ZweiWerteStr:=Machwas(einString);
StringAntwort:=Copy(ZweiWerteStr,1, Pos(';',ZweiWerteStr)-1);
ZahlAntwort:=StrToInt(Copy(ZweiWerteStr, Pos(';',ZweiWerteStr)+1,Length(ZweiWerteStr)-Pos(';',ZweiWerteStr)));

....
Zugegeben, etwas kompliziert, daher ersetze ich meist bei solchen sachen das Ergebnis Pos(...) unter Zuhilfenahme von xPos

Delphi-Quellcode:
....
xPos:=Pos(';',ZweiWerteStr);
StringAntwort:=Copy(ZweiWerteStr,1, xPos-1);
ZahlAntwort:=StrToInt(Copy(ZweiWerteStr, xPos+1,Length(ZweiWerteStr)-xPos));
....
Wenn du gut im Stringzerlegen bist, kannst du soviele Werte zurückliefern wie du willst. Übrigends, das Semikolon nehme ich meist, weil es in Wörtern halt nicht vorkommt, genausogut kannst du Unterstrich oder irgendwas anderes nehmen, um die Werte zu trennen.
Gruß oldmax
Noch ist mein Rechner mir zu Diensten.... ansonsten habe ich die Macht ihn zu vernichten !
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#20

Re: function mit zwei Rückgabewerten?

  Alt 24. Aug 2006, 13:47
Alles in einen String umwandeln und zusammenfassen, und einen String zurueckgeben?
Mal abgesehn davon, dass ein einbeiniger Esel im Rueckwaertslaufen schneller sein wird als diese Implementierung, hast du noch ein Problem, wenn ich im Record einen String habe, der ein ; enthaelt. Dann musst du noch zusaetzlich alles Escapen. Weiters schwierig wirds dann, wenn ich im Record einen weiteren Record habe, oder andere Typen, die man nicht ohne groesseren Aufwand in Strings umwandeln kann.
Sry, aber die string-Methode ist *etwas* [....] Mir faellt das richtige Wort dafuer nicht ein, aber strunzdoof kommt gut hin

Zitat von oldmax:
Der Nachteil der Parameterübergabe mit Vatist, das du sehr schnell eine Variable veränderst, die du gar nicht geändert haben möchtest.
Na ja, bei der Ergebnisvariable waer schon ganz gut, wenn die Prozedur/Funktion diese veraendern wurde

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz