Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mo 11.01.16 18:07 
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:

ausblenden 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:

ausblenden Delphi-Quelltext
1:
PDq  : ^T_DispData;					

mit

ausblenden Delphi-Quelltext
1:
PDq := @Daten.Data1;					

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:

ausblenden 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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 12.01.2016 um 18:41
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 13.01.16 05:36 
Der Unterschied ist, dass mit Klassen das geht:
ausblenden 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.

Für diesen Beitrag haben gedankt: Peter18
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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