Einzelnen Beitrag anzeigen

tdeck

Registriert seit: 26. Jun 2006
Ort: Obertshausen
67 Beiträge
 
Delphi 11 Alexandria
 
#1

Type Record mit unter Records in der Struktur

  Alt 29. Aug 2022, 14:13
Delphi-Version: 5
Hallo Leute,

ich hab ein merkwürdiges Problem, ich denke das hat irgendwas mit Byte-/Word-Orientierung im Speicher zu tun.

Ich habe von einen 8 Bit Controller eine Config-Datei, diese muss ich in Delphi einlesen und auch speichern können.

Ich habe eine Datei die von 0..4095 geht, also 4kb.

Jetzt habe ich mir einen passenden Type erstellt, dieser Type ist ein Record und hat in der Struktur wieder einzelne Arrays von Records enthalten.

In den ersten 3,7kb klappt alles wunderbar, da es aber in den oberen Bereichen nur Müll bei der Anzeige gab, habe ich mir am Controller und in Delphi eine kurze Ausgabe der Adressen in der Variable ausgegeben.

Controller:
Code:
------------------
Cfg1            : 0
Cfg2            : 64
Cfg3            : 128
Cfg4            : 192
sNameCPU       : 256
CfgAWLZelleArray: 270
IPConfig       : 3742
CfgZKSUser     : 3809
CfgLeser       : 4019
eeByte01        : 4032
BInvalidateBoot : 4095
------------------
Delphi:
Code:
------------------
Cfg1            : 0  ok
Cfg2            : 64  ok
Cfg3            : 128 ok
Cfg4            : 192 ok
sNameCPU       : 256 ok
CfgAWLZelleArray: 270 ok
IPConfig       : 3742 ok
CfgZKSUser     : 3810  // um ein Byte in Delphi verschoben!!!
CfgLeser       : 4030
eeByte01        : 4046
BInvalidateBoot : 4109
------------------
Der Array of Record "CfgZKSUser" müsste eigentlich bei 3809 starten, aber er bekommt die Adresse 3810 in Delphi.
Füge ich ein freies Byte vor dem Record als Platzhalter ein, ändert sich nichts. Füge ich zwei ein springt die Adresse in Delphi auf 3812.

Ich vermute es hat irgendwas mit dem Speichersystem / Word/Byte-Orientierung zu tun.
Kann ich den Delphi-Compiler dazu zwingen, dass er die Struktur Byteweise verarbeitet?

Ich würde gerne die 4kb-Datei als Stream einlesen und über die Type "tConfig" auf eine Variable legen um diese recht einfach verarbeiten zu können.

Oder gibt es da ein anderes Problem?

Hier ein Ausschnitt aus dem Config und der Array auf den Record tZKSUser:
Code:
// ZKS User
//
tZKSUser   = record
                 strCode       : string[6]; // Code für PinCode
                 wFreigabe     : word;    // .0  Leser 1
                                            // .1  Leser 2
                                            // .2  Leser 3
                                            // .3  Leser 4
                 LegicCode     : tLegicCode; //array[0..9] of byte; // Nutzendaten RF Karte
                 wFunktionUser : word;    // .0  User Aktiv
                                            // .1  Kurzzeit
                                            // .2  GMS-Dauer
                                            // .3  PinCode
                                            // .4  RFID
               end;
// ZKS User Array
tZKSUserArray   = Array[1..10] of tZKSUser;

 tConfig = record
  Cfg1             : TPVSConfig1;     // Adr.ContrlDatei 0
  Cfg2             : TPVSConfig2;     // Adr.ContrlDatei 64
  Cfg3             : TPVSConfig3;     // Adr.ContrlDatei 128
  Cfg4             : TPVSConfig4;     // Adr.ContrlDatei 192
  sNameCPU        : String[12];      // Adr.ContrlDatei 256
  CfgAWLZelleArray     : tAWLZelleArray; // Adr.ContrlDatei 270
  LeerRaum             : array[0..2870] of byte; // Leerraum
  IPConfig : tIPConfig;         // Adr.ContrlDatei 3742
  LeerRaum2        : array[0..30] of byte; // Leerraum

  CfgZKSUser : tZKSUserArray;  // Adr.ContrlDatei 3809
  CfgLeser : tZKSLeserArray;   // Adr.ContrlDatei 4019

  //ab 4033 feste Werte, nicht mit CFG speichern
  eeByte01 : byte;                        
............
Gruß
Thorsten
Thorsten
  Mit Zitat antworten Zitat