![]() |
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; |
AW: Frage zu record
Wieso nicht?
Packed Records packen immer so, wie ich mir das denke. = Kein Zwischenraum zwischen den einzelnen Feldern, was einem
Delphi-Quellcode:
gleich kommt.
{$A-} | {$A1} | {$ALIGN 1}
Ohne PACKED, bzw. mit ALIGN größer 1 muß man schon etwas nachdenken und wissen wie einige Typen intern aufgebaut sind, um die Ausrichtung zu erkennen. |
AW: Frage zu record
Zitat:
b) falls ich Fremddaten lesen muß sieht das ungefähr so aus
Delphi-Quellcode:
Gruß
myrecord=packed record.....end;
setlength(buffer,sizeof(myrecord)); gelesen:=fs.read(buffer,sizeof(buffer)); K-H |
AW: Frage zu record
Also ich habe ein altes Projekt, wo das mit dem packed und alligned nicht so war.
Dort sind Packed records in Packed records und noch diverse packed array [0..4] of string[10] usw. deklariert und man hat sich gewundert, das beim Lesen der Daten ab der Stelle schießmichtot (3 Jahre her) ein Byteshift um 1 drin var.... Umgestellt auf explizites Lesen jedes Feldes => Alles paletti. @p80286: Belegen kann ich das nicht mehr, das Projekt wurde ja verändert und funktioniert nun. .... Aber wenn ich mir die alte Deklaration so anschaue, wundere ich mich, das dort packed record mit packed array und (!) array kombiniert wurde. Da wundert mich nüscht mehr! Wird wohl daran gelegen haben... |
AW: Frage zu record
Zitat:
Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 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