Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zu record (https://www.delphipraxis.net/169765-frage-zu-record.html)

DelTurbo 10. Aug 2012 09:12

Delphi-Version: 7

Frage zu record
 
Hi,
ich habe einen Record. Der sieht wie folgt aus.

Delphi-Quellcode:
Type
   TKUIndexDaten = record
      Len      :Word;
      Erased      :Byte;
end;
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?

Danke im voraus

Klaus01 10. Aug 2012 09:15

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:
Type
   TKUIndexDaten = packed record
      Len     :Word;
      Erased     :Byte;
end;
Grüße
Klaus

DelTurbo 10. Aug 2012 09:28

AW: Frage zu record
 
Das war es. Vielen Dank!!!

Iwo Asnet 10. Aug 2012 09:36

AW: Frage zu record
 
packed records sind langsamer im Zugriff.

himitsu 10. Aug 2012 09:41

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)

DeddyH 10. Aug 2012 09:42

AW: Frage zu record
 
http://docwiki.embarcadero.com/RADSt...turierte_Typen, da steht es ausführlich.

p80286 10. Aug 2012 10:02

AW: Frage zu record
 
Zitat:

Zitat von Iwo Asnet (Beitrag 1177648)
packed records sind langsamer im Zugriff.

Ja,
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:
record
   a : byte;
   b : word;
   c : integer;
   d : shortstring[8];
end;
Ist da nicht so der Bringer. Ist die Struktur von aussen vorgegeben, dann ist es eh müßig darüber zu diskutieren.

Gruß
K-H

DelTurbo 10. Aug 2012 11:05

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...

mkinzler 10. Aug 2012 11:12

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).

Iwo Asnet 10. Aug 2012 11:25

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:
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;
Um nun ein viele Records einzulesen rufst Du für jedes Element einfach die LoadFromStream-Methode auf.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 Uhr.
Seite 1 von 2  1 2      

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