Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Pointerproblem
Peter18 - Mo 11.01.16 18:07
Titel: Pointerproblem
Ein freundliches Hallo an alle,
Mal wieder ein Verständnisproblem mit Pointern! Ich habe mehrere Strukturen mit Daten erstellt, die vom Typ "T_DispData" sind. Da die Gesamtstruktur recht umfangreich ist hier nur ein Auszug:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| type T_Data = record Working : ^T_DispData; Data1 : T_DispData ; Data2 : T_DispData ; Data3 : T_DispData ; end; |
Working ist als Pointer auf die Daten deklariert, damit ich nicht in jeder Routine prüfen muß, welche Daten gerade genutzt werden.
In einer Routine, in der entschieden wird, welcher Datensatz gerade zu verwenden ist, wird die Variable "PDq" folgendermaßen deklariert:
mit
wird der Datensatz zur Bearbeitung zugewiesen. Es werden einige Daten eingetragen. Soweit so gut! Wenn ich nun vor dem Aufrufen weiterer Routinen "Working"auf diesen Datensatz setzen will:
Delphi-Quelltext
1:
| Cfg.Daten.Working := PDq; |
erhalte ich die Fehlermeldung "Inkompatible Typen"!?!?!? :nixweiss:
Das würde ich gern verstehen!
Grüße von der Noerdsee
Peter
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Di 12.01.2016 um 18:41
jaenicke - Mo 11.01.16 20:58
^T_DispData ist jeweils eine Typdeklaration. Dadurch deklarierst du diesen Typ einmal innerhalb des Records und einmal separat als Typ für die Variable.
Du musst an beiden Stellen den gleichen Typ verwenden. Sprich:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| type TDispData = record end; PDispData = ^TDispData;
TData = record Working : PDispData; Data1 : TDispData; Data2 : TDispData; Data3 : TDispData; end;
...
PDq : PDispData; |
Nebenbei:
Gibt es einen Grund warum du dir diese manuelle Pointerschieberei antust? Das sieht nämlich nach einem erstklassiges Beispiel für die Nützlichkeit von Klassen aus...
Da steckt dann auch ein Pointer dahinter, aber du musst dich nicht darum kümmern...
Peter18 - Di 12.01.16 17:15
Hallo jaenicke,
dank Dir für Deine Antwort. Vor vielen Jahren habe ich mit Wirth-Pascal ond Kernighan and Ritchie C begonnen. Dann kam eine lange Programmierpause und kürzlich habe ich wieder angefangen und in die objektorientierte Programmierung eingearbeitet.
Warscheinlich übersehe ich noch nict die Möglichkeiten, die Klassen bieten vollständig. Es erschien mir einfacher wichtige Parameter in einer Struktur zusammenzufassen, als sie einzeln zu übergeben.
Wenn Du dazu noch ein paar Tipps auf Lager hast, wär ich dir dankbar.
Grüße von der Nordsee
Peter
jaenicke - Mi 13.01.16 05:36
Der Unterschied ist, dass mit Klassen das geht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| type TDispData = class end;
TData = class public Working : TDispData; Data1 : TDispData; Data2 : TDispData; Data3 : TDispData; end;
...
PDq : TDispData;
...
PDq := TDispData.Create; Cfg.Daten.Working := PDq; |
Klassen musst du explizit erstellen, dafür wird beim Zuweisen nicht die komplette Struktur kopiert, sondern immer nur der Pointer darauf übergeben ohne dass du das explizit mitbekommst.
Peter18 - Do 14.01.16 17:35
Hallo jaenicke,
Dank Die für Deine Antwort! Damit muß ich mich wohl noch etwas ausführlicher beschäftigen.
Grüße von der regnerischen Nordsee
Peter
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!