![]() |
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:
Ich bekomme eine AV ("[...] write of adress 00000000" !?). Aber warum?
// 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; |
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:
Dann geht das...
FSettings := @Settings;
MfG Muetze1 |
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:
|
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 12:20 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