![]() |
Verstehe das Verhalten der Records nicht.
Hallo zusammen,
geben ist Folgender Quellcode. An der Stelle wo CompareMem aufgerufen wird müssten die Records eigentlich Identisch sein. Die Methode gibt mir aber False zurück. Wenn ich die beiden Records auswerte scheinen alle Records gleich zu sein und KFMKey ist = 'XXX 148060'. Nach dem ich es ein paar mal Debuggt habe, entschloss ich mich die Daten in eine Datei zu schreiben um zu prüfen ob die Binär gleich sind. Das Ergebniss ist das in der Datei jeweils der erste Wert steht und nicht der Neue. Dann habe ich noch folgende beiden Zeilen hinzugefügt und in der Datei wird es als XXX Test6001 gepseichert.
Code:
Muss ich die Record Felder Fillcharn? Ist dies das normale Verhalten? Wie Säubere ich das Recordfeld?
lRec.SampleRecordInside.KfmKey := 'XXX 14806001';
lRec.SampleRecordInside.KfmKey := 'XXX Test';
Code:
Gruß,TKFMKey = string[16]; TSampleRecord = record Count : byte; KfmKey : TKFMKey; end; TOtherSampleRecord = record Count : byte; PaIsolatorKey : TKFMKey; PtIsolatorKey : TKFMKey; end; TMyRec = record aBoolean : boolean; KfmKey : TKFMKey; OtherSampleRecord : array[1..5] of TOtherSampleRecord; SampleRecordInside : TSampleRecord; SampleRecordOutside : TSampleRecord; SampleRecordMiddle : TSampleRecord; res : array[1..50] of byte; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btn2Click(Sender: TObject); var lRec : TMyRec; lRec2 : TMyRec; lStream : TFileStream; lStream2: TFileStream; begin FillChar(lRec, sizeof(TMyRec),0); FillChar(lRec2, sizeof(TMyRec),0); lRec.KfmKey := 'XXX 14806001'; lRec2.KfmKey := 'XXX 14806002'; lRec.KfmKey := 'XXX 148060'; lRec2.KfmKey := 'XXX 148060'; if CompareMem(@lRec, @lRec2,SizeOf(TMyRec)) then // Müssten gleich sein sind sie aber nicht ShowMessage('Juhu') else ShowMessage('Fuck'); lRec.SampleRecordInside.KfmKey := 'XXX 14806001'; lRec.SampleRecordInside.KfmKey := 'XXX Test'; ShowMessage(lRec.KfmKey); ShowMessage(lRec2.KfmKey); // Speichern der Testeinträge lStream := TFileStream.Create('C:\temp\test1a.dat',fmCreate); lStream.WriteBuffer(lRec,SizeOF(TMyRec)); lStream.Free; lStream2 := TFileStream.Create('C:\temp\test2a.dat',fmCreate); lStream2.WriteBuffer(lRec2,SizeOF(TMyRec)); lStream2.Free; end; DevLinus |
AW: Verstehe das Verhalten der Records nicht.
Das Problem ist CompareMem auf einen shortstring.
Beim Zuweisen eines shortstrings wird nicht der "Rest" geleert. Beispiel:
Delphi-Quellcode:
var
s: string[16]; i: Integer; begin s := 'XXX 14806001'; s := 'XXX 148060'; for i := 1 to 16 do Write(s[i]); end. |
AW: Verstehe das Verhalten der Records nicht.
Zitat:
|
AW: Verstehe das Verhalten der Records nicht.
Zitat:
Ausgehend von Align 4 (der default denke ich) sieht Dein Record im Speicher so aus:
Delphi-Quellcode:
Kannst Du einfach mit sizeof(TSampleRecord) nachschauen. Habe es jetzt nicht getestet aber gehe davon aus das der Record 24 Byte gross ist.
TSampleRecord = record
Count : byte; hidden : array[0..2] of byte; // Für das Align wird das vom Compiler eingebaut KfmKey : TKFMKey; // 17 byte hidden : array[0..2] of byte; // Für das Align wird das vom Compiler eingebaut end; |
AW: Verstehe das Verhalten der Records nicht.
Ich würde dafür class operators benutzen:
Delphi-Quellcode:
TSampleRecord = record
Count: byte; KfmKey: TKFMKey; // 17 byte class operator Equal(a: TSampleRecord; b: TSampleRecord): Boolean; end; ... class operator TSampleRecord.Equal(a: TSampleRecord; b: TSampleRecord): Boolean; begin Result := (a.Count = b.Count) and (a.KfmKey = b.KfmKey); end; ... var Test1, Test2: TSampleRecord; begin ... if Test1 = Test2 then // einfach vergleichen ... |
AW: Verstehe das Verhalten der Records nicht.
Zitat:
Je nach verwendeter Delphi Version steht dir aber auch die Möglichkeit der ![]()
Delphi-Quellcode:
if Rec = lRec2 then
Zitat:
|
AW: Verstehe das Verhalten der Records nicht.
Zitat:
Gruß K-H |
AW: Verstehe das Verhalten der Records nicht.
Danke! Mir haben eure Tipps weiter geholfen.
Delphi Version habe ich jetzt angegeben. |
AW: Verstehe das Verhalten der Records nicht.
Zitat:
Grüße Dalai |
AW: Verstehe das Verhalten der Records nicht.
Bei ShortStrings geht das klar.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:38 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 by Thomas Breitkreuz