Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme mit Pointer-Übergabe - Was mache ich falsch? (https://www.delphipraxis.net/20888-probleme-mit-pointer-uebergabe-mache-ich-falsch.html)

Nonsense 24. Apr 2004 19:32


Probleme mit Pointer-Übergabe - Was mache ich falsch?
 
Hallo,

ich möchte einen Pointer auf eine Instanz speichern, um später auf diese zuzugreifen.
Delphi-Quellcode:
// Die Prozedur wird von einer anderen Unit aus aufgerufen.

procedure TFormParameter.MeineProzedur(Settings: TSettings);
var
  FSettings: ^TSettings;
begin
  // Settings wird übergeben und Pointer soll gespeichert werden
  FSettings^ := Settings;

  [...]
end;
Ich bekomme eine AV ("[...] write of adress 00000000" !?). Aber warum?

Muetze1 24. Apr 2004 20:10

Re: Probleme mit Pointer-Übergabe - Was mache ich falsch?
 
Moin!

1. Eine Instanz ist schon ein Zeiger - daher ist Settings auch immer nur 4 Bytes gross, weil es ein Pointer ist (kannste ja mal mit SizeOf() nachprüfen). Somit brauchst du für deine Lösung einfach nur eine Variable vom Typ TSettings deklarieren und diese kannst du nehmen zum speichern.

2. Warum die AV kommt? Kein Problem, überlegen wir mal gemeinsam:

2a) du definierst eine Variable vom Typ "Zeiger auf TSettings" - ist ok.
2b) danach enthält der Zeiger nix - also Nil, weil er wurde noch nicht auf irgendwas gesetzt, daher zeigt er auf nix.
2c) Du weist der Adresse wohin FSettings gerade hinzeigt die Instanz Settings zu - und da liegt das Problem: FSettings zeigt nirgendwo hin, praktisch auf Adresse 0, da ihm noch keine gegeben wurde, wohin er zeigen soll. Daher die AV.

Abhilfe zu deinem Beispiel:

Ein Zeiger enthält immer nur die Adresse, wo was steht. Daher weise dem Zeiger einfach die Adresse von Settings zu:
Delphi-Quellcode:
  FSettings := @Settings;
Dann geht das...

MfG
Muetze1

Nonsense 24. Apr 2004 21:03

Re: Probleme mit Pointer-Übergabe - Was mache ich falsch?
 
Danke. Und ich dachte, wenn ich "FSettings: TSettings" anstatt "FSettings: ^TSettings" nehme, wird FSettings eine Kopie vom übergebenen Objekt. Habe es mit SizeOf überprüft und es sind wirklich nur 4 Byte. Boah. :P :wink:

Muetze1 24. Apr 2004 23:20

Re: Probleme mit Pointer-Übergabe - Was mache ich falsch?
 
Moin!

Da kannst du entweder ganz beruhigt sein oder ganz besorgt sein, aber sowas wie die automatischen Copy Constructoren bei C++ gibt es bei Delphi nicht - und auch nicht diese Automatismen mit dem automatischen kopieren...

In Delphi wird sowas eigentlich immer so gelöst, dass man entweder eine neue Instanz anlegt und dem Constructor als Parameter eine Instanz gleichen Typs gibt von der dann alles kopiert wird, oder es wird eine neue Instanz angelegt und man nutzt eine Methode (z.B. Assign ist weit verbreitet) die dann eine Instanz bekommt und dann die Eigenschaften/Daten kopiert...

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:14 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