AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi [Gelöst] Problem mit Pointer als Rückgabewert einer Funktion
Thema durchsuchen
Ansicht
Themen-Optionen

[Gelöst] Problem mit Pointer als Rückgabewert einer Funktion

Ein Thema von epileptic_squirrel · begonnen am 7. Feb 2010 · letzter Beitrag vom 8. Feb 2010
Antwort Antwort
Seite 1 von 2  1 2      
epileptic_squirrel

Registriert seit: 28. Feb 2009
8 Beiträge
 
#1

[Gelöst] Problem mit Pointer als Rückgabewert einer Funktion

  Alt 7. Feb 2010, 20:33
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;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Problem mit Pointer als Rückgabewert (einer Funktion)

  Alt 7. Feb 2010, 20:39
Da lokale Variablen nur währrend der Laufzeit einer Funktion existent sind, füht ein Zeiger auf einen natürlich auch ins Nirvana
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#3

Re: Problem mit Pointer als Rückgabewert (einer Funktion)

  Alt 7. Feb 2010, 20:41
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...
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
epileptic_squirrel

Registriert seit: 28. Feb 2009
8 Beiträge
 
#4

Re: Problem mit Pointer als Rückgabewert (einer Funktion)

  Alt 7. Feb 2010, 20:52
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#5

Re: [Gelöst] Problem mit Pointer als Rückgabewert einer Funk

  Alt 7. Feb 2010, 20:58
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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
epileptic_squirrel

Registriert seit: 28. Feb 2009
8 Beiträge
 
#6

Re: [Gelöst] Problem mit Pointer als Rückgabewert einer Funk

  Alt 7. Feb 2010, 21:16
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#7

Re: [Gelöst] Problem mit Pointer als Rückgabewert einer Funk

  Alt 7. Feb 2010, 21:30
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: [Gelöst] Problem mit Pointer als Rückgabewert einer Funk

  Alt 7. Feb 2010, 21:36
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
epileptic_squirrel

Registriert seit: 28. Feb 2009
8 Beiträge
 
#9

Re: [Gelöst] Problem mit Pointer als Rückgabewert einer Funk

  Alt 7. Feb 2010, 21:51
@Luckie:
Was wäre denn eine bessere lösung um etwas vergleichbares zu realisieren?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: [Gelöst] Problem mit Pointer als Rückgabewert einer Funk

  Alt 7. Feb 2010, 21:54
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;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:39 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