![]() |
[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; |
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
|
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... |
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; |
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? |
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; |
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 |
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.
|
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? |
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 00:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz