Am 07.07.2019 um 12:54 schrieb Sven Barth:
Am 07.07.2019 um 02:55 schrieb Ralf Quint:
On 7/6/2019 12:21 PM, Florian Klaempfl wrote:
Am 05.07.2019 um 13:53 schrieb Ralf Quint:
Shouldn't a PACKED Record guarantee that values are aligned at the byte
level?
It does in TP, but the ISO says only that it shall be economised.

Well, the ISO is probably what has done most of the damage to Pascal. AFAIK, the ISO doesn't not actually specify any "packed record" per se, but there is an explicit PACK and UNPACK procedures to more economically store sets and arrays (and possibly records, I would have to look up the ISO text to be certain). For example this would be something to create bit fields, pretty much the only feature of C that I sometimes miss in (Free)Pascal.
You mean like this?

=== code begin ===

struct Test
{
        uint8_t field1;
        uint16_t bfield1 : 1;
        uint16_t bfield2 : 1;
        uint16_t bfield3 : 3;
        uint16_t bfield4 : 5;
        uint16_t bfield5 : 1;
        uint16_t field2;
};

=== code end ===

=== code begin ===

type
  TTest = bitpacked record
    field1: UInt8;
    bfield1: 0..1;
    bfield2: 0..1;
    bfield3: 0..7;
    bfield4: 0..31;
    bfield5: 0..1;
    pad: UInt8; // needed due to bitpacked
    field2: UInt16;
  end;

=== code end ===

Small correction: there needs to be another "bpad: 0..31;" field between bfield5 and pad, cause otherwise the pad field will be directly behind the bfield5 one. This could of course be avoided by putting the bit fields into a subrecord, though then of course there'd be the need for an additional field name.

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to