Autor Beitrag
J.Borchert
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 150

WIN10
XE2 Professional
BeitragVerfasst: Fr 05.09.03 11:00 
Ich möchte eine Konvertierung der Daten einer Textdatei in ein vorgegebenes Format durchführen. Dazu folgendes Beispiel:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
{$H-}
type KM = record
                nam: array [1..6of byte;
                d:double;
          end;
var  KMT:KM;
     s : string;
     i : integer;
     F : file of KM;
begin      assignFile(F,'TEST');
           rewrite(F);
           s:=' 8608+';
           for i:=1 to 6 do KMT.nam[i]:=ord(s[i]);
           KMT.d:=104564.45;
           write(F,KMT);
           closeFile(F);
end;

Wenn ich den Double wegnehme, werden 6 byte gespeichert. Wenn der Double (wie hier) folgt, werden für KMT.nam 8 byte geschrieben. Wie kann ich erreichen, das hier nur 6 byte für KMT.nam und 8 byte für KMT.d geschrieben werden ?

mfG Jürgen

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.
kasi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37

Win XP
D5 Ent
BeitragVerfasst: Fr 05.09.03 16:47 
ausblenden Delphi-Quelltext
1:
type KM = packed record					


KASI


Moderiert von user profile icontommie-lie: Delphi-Tags hinzugefügt
J.Borchert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 150

WIN10
XE2 Professional
BeitragVerfasst: So 07.09.03 21:14 
:lol: Vielen Dank, hat auf Anhieb geklappt..........

Hatte wohl etwas unglücklich formuliert, die Double machten mir das Leben schwer. Ich weiß aber immer noch nicht so richtig, was es mit dem packed auf sich hat.
Habe leider nur eine abgespeckte Werbe-Version von D6.0 auf englisch.

Danke sagt Jürgen
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: So 07.09.03 21:26 
J.Borchert hat folgendes geschrieben:
Ich weiß aber immer noch nicht so richtig, was es mit dem packed auf sich hat.

Die x86er-Architektur hat 32 Bit breite Register. Dein Prozessor kann also am schnellsten 32Bit auf einmal verarbeiten.
Daher richtet Delphi einen Record automatisch an diese Breite aus.
Wenn du
ausblenden Delphi-Quelltext
1:
2:
3:
4:
blah = record
blah: Byte
blah: LongWord
end;

schreibst, ist dein Record nicht, wie eigentlich zu vermuten, 5 Byte lang, groß, sondern 8. 32 Bit für den LongWord und 32 Bit für den Byte, obwohl dieser nur 8 Bit lang ist. die restlichen 24 Bit sind Nullen.

Du hattest durch dein array[1..6] 6 Byte (32+16=48 Bit) und durch den Double nochmal 8. Delphi lässt jetzt zwischen dem Array und dem Double 16 Bit frei, damit er das Array in zwei Registern und den Double in zwei Registern unterbringen kann, ohne die Daten auseinanderzupfriemeln. Durch das packed record wird der Programmablauf also langsamer, man sollte also falls möglich immer auf das record verzichten.
Manchmal kommt man aber nicht um ein packed umher, insbesondere wenn man mit einer API zu tun hat, die in C geschrieben wurde, so erwartet z.B. Windows in der Regel immer packed records.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert