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