![]() |
Delphi-Version: 7
Frage zu record
Hi,
ich habe einen Record. Der sieht wie folgt aus.
Delphi-Quellcode:
Wenn ich nun mit SizeOf(TKUIndexDaten) die grösse abfrage, bekomm ich 4 zurück. Lasse ich "Len" weg, bekomme ich richtigerweise eine 1 zurück. Was mache ich falsch?
Type
TKUIndexDaten = record Len :Word; Erased :Byte; end; Danke im voraus |
AW: Frage zu record
Hallo,
2 Byte -> Word 1 Byte padding 1 Byte -> Byte Summe 4 Byte Wenn Du ein packed record erstellst, sollte als size 3 Byte herauskommen.
Delphi-Quellcode:
Grüße
Type
TKUIndexDaten = packed record Len :Word; Erased :Byte; end; Klaus |
AW: Frage zu record
Das war es. Vielen Dank!!!
|
AW: Frage zu record
packed records sind langsamer im Zugriff.
|
AW: Frage zu record
Langsamer: In diesem Fall definitiv nein.
Denn an den Daten selber hat sich nichts geändert, da nur das abschließende Leerbyte verwindet. Aber im ansonsten jain ... kommt halt immer auf den jeweiligen Aufbau der Daten an und ob die CPU so oder Bytes rumshiften muß. Im Allgemeinen hat die Speicherausrichtung schon ihre guten Gründe. PS: Wenn es um Datenrecords für eine Dateiverwaltung oder Datenübertragung/Datenübergabe handelt, dann kommt es eben mehr auf das Format und nicht auf Optimierung an. (es sei denn man hat im Voraus das Datenformat/Protokoll entsprechend optimiert) |
AW: Frage zu record
![]() |
AW: Frage zu record
Zitat:
und welche Auswirkung hat das in der Praxis? und ob packed oder nicht, ist egal solange Du bei der Record-Definition entsprechende Rücksichten genommen hast.
Delphi-Quellcode:
Ist da nicht so der Bringer. Ist die Struktur von aussen vorgegeben, dann ist es eh müßig darüber zu diskutieren.
record
a : byte; b : word; c : integer; d : shortstring[8]; end; Gruß K-H |
AW: Frage zu record
Das ist eine "Fremddatei" die ich einlese. Die hat knapp 200kb. Ich glaube kaum das man da einen Speedverlust bemerkt.
Trotzdem danke an alle... |
AW: Frage zu record
Das Schreiben/Lesen in eine Datei kann aber eine weitere Stolperfalle darstellen. In diesem Fall sollte man auf ein Alignment verzichten und packed verwenden, da sonst Unterschiede in der Plattform Auswirkungen auf die Struktur der Datei haben ( eine unter 32Bit gespeicherte Datei wird dann unter 64Bit falsch interpretiert).
|
AW: Frage zu record
Ich würde das nicht tun!
Denn packed records packen manchmal eben nicht so, wie man sich das denkt. Irgendwann (Arrays mit ungerader Länge) wird doch auf das nächst gerade Byte ausgerichtet und -wupps- hat man den Salat. Lies die Daten lieber explizit über einen Stream Wert für Wert ein: Das geht so schnell, das merkst Du nicht. Spendiere also deinem Record eine Leseroutine
Delphi-Quellcode:
Um nun ein viele Records einzulesen rufst Du für jedes Element einfach die LoadFromStream-Methode auf.
Type
TKUIndexDaten = record Len :Word; Erased :Byte; Procedure LoadFromStream (stream : TStream); end; Procedure TKUIndexDaten.LoadFromStream (stream : TStream); begin // Hier werden garantiert immer 3 Bytes gelesen (solange Word=2 Byte und Byte=1 Byte lang ist) stream.Read (Len, SizeOf(Len)); stream.Read (Erased, SizeOf(Erased )); End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 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