Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [Gelöst] Problem mit Pointer als Rückgabewert einer Funktion (https://www.delphipraxis.net/147407-%5Bgeloest%5D-problem-mit-pointer-als-rueckgabewert-einer-funktion.html)

epileptic_squirrel 7. Feb 2010 19:33


[Gelöst] Problem mit Pointer als Rückgabewert einer Funktion
 
Hallo zusammen, ich möchte aus einer funktion einen pointer auf einen String zurückgeben.
Paradoxerweise kann ich durch den pointer der ich der funktion übergebe, korrekt auf den wert zugreifen und verwenden,
allerdings der rückgabewert der funktion liefert mir immer ein leeres ergebnis.
Hier mal der quelltext.

Delphi-Quellcode:
function DoSomething(Param: Pointer): Pointer;
var PString: ^String;
    MyString: String;
begin
  PString := Param;
  ShowMessage(PString^); // Funktioniert
  MyString := 'foobar';
  result := @MyString;
end;

procedure TForm1.Button1Click(Sender: TObject);
var PString: ^String;
    ParamText: String;
begin
  ParamText := 'foo';
  PString := DoSomething(@ParamText);
  ShowMessage(PString^); // Funktioniert nicht
end;

mkinzler 7. Feb 2010 19:39

Re: Problem mit Pointer als Rückgabewert (einer Funktion)
 
Da lokale Variablen nur währrend der Laufzeit einer Funktion existent sind, füht ein Zeiger auf einen natürlich auch ins Nirvana

rollstuhlfahrer 7. Feb 2010 19:41

Re: Problem mit Pointer als Rückgabewert (einer Funktion)
 
das wird so auch nicht gehen. Der Pointer zeigt während die Funktion "DoSomething" läuft auf einen gültigen String. Sobald die Funktion aber beendet wird, werden ALLE LOKALEN Variablen aus dem Speicher gelöscht, also genullt. Dein Pointer bleibt übrig und zeigt immer noch auf die Stelle, wo mal dein String war. Den String gibt es allerdings nicht mehr, also kannst du ihn auch nicht mehr zurückholen. Um das möglich zu machen, brauchst du einen Pointer, den du mit new() initialisierst und dann dem Pointer einen Inhalt gibst. Dann erst ist der Pointer länger als die Funktion vorhanden.

Bernhard

EDIT: langsamer...

epileptic_squirrel 7. Feb 2010 19:52

Re: Problem mit Pointer als Rückgabewert (einer Funktion)
 
Vielen dank für den hinweis, nun funktioniert es wie es soll.

(Für alle die sich für die lösung interessieren)
Delphi-Quellcode:
function DoSomething: Pointer;
var PString: ^String;
begin
  New(PString);
  PString^ := 'foobar';
  Result := PString;
end;

procedure TForm1.Button1Click(Sender: TObject);
var PString: ^String;
begin
  PString := DoSomething;
  ShowMessage(PString^);
  Dispose(PString);
end;

himitsu 7. Feb 2010 19:58

Re: [Gelöst] Problem mit Pointer als Rückgabewert einer Funk
 
Die Frage nach dem "Wozu" bleibt jetzt nur noch übrig.

Ein String ist intern doch schon ein Zeiger.
Wozu benötigst du also einen Zeiger auf einen Zeiger?

epileptic_squirrel 7. Feb 2010 20:16

Re: [Gelöst] Problem mit Pointer als Rückgabewert einer Funk
 
Das war ja auch nur ein beispiel.
Ich möchte einer funktion einen parameter übergeben und abhängig davon soll ein pointer auf ein bestimmtes record zurückgegeben werden.
Somit kann man dann mit nur einer funktion viele verschiedene aufgaben erfüllen.
(Zumindest so der Plan)

Beispiel(eher als pseudocode zu verstehen):

Delphi-Quellcode:
function DoSomething(Option: Integer): Pointer;
...
begin
  case (Option) of
    0:
    begin
      MyRecord1 := GibMirIrgwas;
      result := @MyRecord1;
    end;
    1:
    begin
      MyRecord2 := GibMirIrgwasAnders;
      result := @MyRecord2;
    end;
  end;
end;

himitsu 7. Feb 2010 20:30

Re: [Gelöst] Problem mit Pointer als Rückgabewert einer Funk
 
Dann würde sich hier OOP ganz gut machen.

> Objekte als Rückgabewert


Hätte auch den Vorteil, daß man direkt aus dem Result auf den Inhalt schließen kann.
Stchwort: IS

Luckie 7. Feb 2010 20:36

Re: [Gelöst] Problem mit Pointer als Rückgabewert einer Funk
 
Das ist aber kein gutes Design. Woher weiß ich, was ich für ein Record zurückbekomme? Wenn jemand anders deinen Code weiterpflegen soll, der wird dich verfluchen. Guter Quellcode sollte selbst-dokumentierend sein.

epileptic_squirrel 7. Feb 2010 20:51

Re: [Gelöst] Problem mit Pointer als Rückgabewert einer Funk
 
@Luckie:
Was wäre denn eine bessere lösung um etwas vergleichbares zu realisieren?

Luckie 7. Feb 2010 20:54

Re: [Gelöst] Problem mit Pointer als Rückgabewert einer Funk
 
Aufteilen. Für jeden Record einen separaten Getter mit aussagekräftigen Namen. Dann weiß ich was ich zurückbekomme, wenn ich den Getter aufrufe.

Delphi-Quellcode:
case Option of
  0: record1 := GetRecord1;
  1: record2 := GetRecord2;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:28 Uhr.
Seite 1 von 2  1 2      

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