AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Type Record mit unter Records in der Struktur

Ein Thema von tdeck · begonnen am 29. Aug 2022 · letzter Beitrag vom 6. Sep 2022
Antwort Antwort
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
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Type Record mit unter Records in der Struktur

  Alt 29. Aug 2022, 14:19
Hast Du es mal mit packed records versucht?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.815 Beiträge
 
Delphi 12 Athens
 
#3

AW: Type Record mit unter Records in der Struktur

  Alt 29. Aug 2022, 14:52
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
  Mit Zitat antworten Zitat
tdeck

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

AW: Type Record mit unter Records in der Struktur

  Alt 29. Aug 2022, 14:59
Hast Du es mal mit packed records versucht?
Hallo DeddyH,

klasse, mit "packed Records" hat es funktioniert.
Jetzt passt die Reihenfolge.

Vielen Dank

Thorsten
Thorsten
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#5

AW: Type Record mit unter Records in der Struktur

  Alt 29. Aug 2022, 15:18
{$A-} bzw. {$ALIGN OFF} oder {$A1} bzw. {$ALIGN 1} wäre ach gegangen.

Und innerhalb von Arrays entsprechend tZKSUserArray = packed array[1..10] of tZKSUser; ,
bzw. falls es vom PackedRecord nicht bis zum Array durch gehen würde, 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (29. Aug 2022 um 15:25 Uhr)
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
481 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Type Record mit unter Records in der Struktur

  Alt 5. Sep 2022, 13:02
Hast Du es mal mit packed records versucht?
Entweder das, oder du nimmst Füllfelder bzw. eine Variante mit anderer Größe. Je nachdem, was du genau damit anfangen willst.
Dennis
  Mit Zitat antworten Zitat
tdeck

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

AW: Type Record mit unter Records in der Struktur

  Alt 6. Sep 2022, 09:01
Hast Du es mal mit packed records versucht?
Entweder das, oder du nimmst Füllfelder bzw. eine Variante mit anderer Größe. Je nachdem, was du genau damit anfangen willst.
Hallo,

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
Thorsten
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz