![]() |
Delphi-Version: 5
Type Record mit unter Records in der Struktur
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:
Delphi:
------------------
Cfg1 : 0 Cfg2 : 64 Cfg3 : 128 Cfg4 : 192 sNameCPU : 256 CfgAWLZelleArray: 270 IPConfig : 3742 CfgZKSUser : 3809 CfgLeser : 4019 eeByte01 : 4032 BInvalidateBoot : 4095 ------------------
Code:
Der Array of Record "CfgZKSUser" müsste eigentlich bei 3809 starten, aber er bekommt die Adresse 3810 in Delphi.
------------------
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 ------------------ 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:
Gruß
// 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; ............ Thorsten |
AW: Type Record mit unter Records in der Struktur
Hast Du es mal mit packed records versucht?
|
AW: Type Record mit unter Records in der Struktur
DeddyH hat recht: statt record im Delphi mal packed record hinschreiben.
Dann werden Felder direkt hintereinander ausgerichtet, anstatt auf irgendwelche Registergrößen zwe3cks schnellerem Zugriff zu optimieren. Grüße TurboMagic |
AW: Type Record mit unter Records in der Struktur
Zitat:
klasse, mit "packed Records" hat es funktioniert. Jetzt passt die Reihenfolge. Vielen Dank :-) Thorsten |
AW: Type Record mit unter Records in der Struktur
Delphi-Quellcode:
bzw.
{$A-}
Delphi-Quellcode:
oder
{$ALIGN OFF}
Delphi-Quellcode:
bzw.
{$A1}
Delphi-Quellcode:
wäre ach gegangen.
{$ALIGN 1}
Und innerhalb von Arrays entsprechend
Delphi-Quellcode:
,
tZKSUserArray = packed array[1..10] of tZKSUser;
bzw. falls es vom PackedRecord nicht bis zum Array durch gehen würde,
Delphi-Quellcode:
LeerRaum2 : packed array[0..30] of byte; // auch wenn Byte sowieso immer $A1 ergibt
Genauso, wie falsche / veränderliche Typen, gehören externe Datenstrukturen auch immer Fest definiert, also eben mit PACKED oder einem definierten ALIGN, denn das Default-ALIGN ändert sich gern mal, je nach Compiler und Zielplatform. |
AW: Type Record mit unter Records in der Struktur
Zitat:
![]() |
AW: Type Record mit unter Records in der Struktur
Zitat:
nein das mit den Füllfeldern hat nicht funktioniert, das war meine erste Idee. Die Lösung mit "packed Records" war genau das richtige. Ich kann die vorhandene Datenstucktur der Mikrocontroller nicht mehr nachträglich ändern, da diese Strukturen schon seit Jahren in dieser Form im Einsatz sind. Und über USB hätte ich zwar die Struktur immer hin und her schieben können. Aber das macht das USB Protokoll umständlich, ich übertrage immer ganze 512Byte am Stück via USB. Die selben Funktionen nutze ich auch für den Dateitransfer und so muss ich mir keine Gedanken machen ob es jetzt ein Teil von einer Dateiübertragung ist oder eine Config mit den Records. Passt schon mit dem "Packed" Thorsten |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:23 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