{$PackRecords ?}

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

{$PackRecords ?}

Beitragvon Mathias » 15. Mär 2018, 18:44 {$PackRecords ?}

Egal was ich bei $PackRecords reinschreibe, ob es 1, 2, 4 ,8 ,16, 32 ist, SizeOf gibt immer "3" aus.
Ausser wen ich eine Zahl nehme, die nicht in der 2er-Potenz ist, kommt eine Fehlermeldung oder ab 64.
Code: Alles auswählen
{$PackRecords 4}
type
  Trec2 = record
    a: byte;
    b: byte;
    c: byte;
  end;
 
begin
  WriteLn(SizeOf(Trec2));
end.

Wieso hat der Wert bei $PackRecords keinen Einfluss ?
FPC 3.0.4 Linux 64Bit.

Bei Win32 das Gleiche.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3993
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Soner » 15. Mär 2018, 19:11 Re: {$PackRecords ?}

Es zählt einfach Bytes von Record-Daten. Wenn du ein "d:byte" hinzufügst, dann gibt sizeof 4 aus, bei noch ein "e:byte" wird daraus 5. Ist ja klar 5 Byte.
$packrecords hat überhaupt keinen Einfluß aus der Erklärung https://www.freepascal.org/docs-html/3.0.0/prog/progsu60.html werde ich nicht schlau. Es scheint mir Bug zu sein.
Soner
 
Beiträge: 411
Registriert: 26. Sep 2012, 23:07
Wohnort: Hamburg
OS, Lazarus, FPC: Win7Pro-32Bit, Immer letzte Lazarus Release mit SVN-Fixes | 
CPU-Target: 32Bit
Nach oben

Beitragvon indianer-frank » 15. Mär 2018, 19:56 Re: {$PackRecords ?}

Soner hat geschrieben:$packrecords hat überhaupt keinen Einfluß aus der Erklärung https://www.freepascal.org/docs-html/3.0.0/prog/progsu60.html werde ich nicht schlau. Es scheint mir Bug zu sein.

"This means that the elements of a record which have size greater than n will be aligned on n byte boundaries."

Ist doch einfach: da sizeof(Byte)=1 ist, und dies nicht größer als 1,2,.. ist, werden Bytes nicht nicht aligned. Wenn man den Link als Spezifikation ansehen kann, ist es also kein Bug.
indianer-frank
 
Beiträge: 130
Registriert: 30. Nov 2008, 21:53

Beitragvon Mathias » 15. Mär 2018, 19:57 Re: {$PackRecords ?}

Dazumal hatte dies noch funktioniert: http://www.lazarusforum.de/viewtopic.php?f=10&t=9131&p=80869&hilit=PackRecords#p80869

Ich werde mal eine Bug-report schreiben.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3993
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon indianer-frank » 15. Mär 2018, 20:02 Re: {$PackRecords ?}

Mathias hat geschrieben:Dazumal hatte dies noch funktioniert: http://www.lazarusforum.de/viewtopic.php?f=10&t=9131&p=80869&hilit=PackRecords#p80869

Ich werde mal eine Bug-report schreiben.

Langsam! Dort sind im Record ja auch andere Typen (double, longint...). Und Record-Felder mit sizeof(..) > 1 werden aligned.
indianer-frank
 
Beiträge: 130
Registriert: 30. Nov 2008, 21:53

Beitragvon Mathias » 15. Mär 2018, 20:11 Re: {$PackRecords ?}

Dies müsste eigentlich 64 ausgeben und nicht 48. :roll:
4x16 gibt 64.
Code: Alles auswählen
type
  tvec3 = array[0..2] of single;
 
  {$PackRecords 16}
type
  Trec2 = record
    v0: tvec3;
    v1: tvec3;
    v2: tvec3;
    v3: tvec3;
  end
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3993
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Horst_h » 15. Mär 2018, 20:12 Re: {$PackRecords ?}

Hallo,

Das funktioniert nur bei unterschiedlichen Größen im record.
Wenn alle gleich sind, macht es weniger Sinn.Byte/word/integer liegen ab dem aligned Start immer auf passenden Grenzen/Adressen.

Code: Alles auswählen
 
{$PackRecords 1}
type
  Trec1 = record
    a: byte;
    b: longint;
  end;
{$PackRecords 2}
type
  Trec2 = record
    a: byte;
    b: longint;
  end;
{$PackRecords 4}
type
  Trec3 = record
    a: byte;
    b: longint;
  end;
 
begin
  WriteLn(SizeOf(Trec1));
  WriteLn(SizeOf(Trec2));
  WriteLn(SizeOf(Trec3));
end.
[/laz]
 
Ausgabe
[code] 
5
6
8
 


Gruß Horst
Horst_h
 
Beiträge: 59
Registriert: 20. Mär 2013, 08:57

Beitragvon indianer-frank » 15. Mär 2018, 20:18 Re: {$PackRecords ?}

Mathias hat geschrieben:Dies müsste eigentlich 64 ausgeben und nicht 48. :roll:
4x16 gibt 64.

Wieder der gleiche Fehler: sizeof(tvec3)=12 und das ist kleiner als 16. Also Größe = 4*12 = 48.
indianer-frank
 
Beiträge: 130
Registriert: 30. Nov 2008, 21:53

Beitragvon Mathias » 15. Mär 2018, 22:26 Re: {$PackRecords ?}

Ein 2. Byte müsste gleich behandelt werden, wie ein Integer an 2. Stelle.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3993
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: Exabot [Bot] und 3 Gäste

porpoises-institution
accuracy-worried