C - rychly dotaz

Jan Waclawek konfera na efton.sk
Středa Březen 21 11:04:18 CET 2018


Teoreticky by ste nemali mat kontrolu nad rozmiestnenim premennych v
strukture, ak su dodrzane pravidla podla normy (ktore su relativne laxne,
aby sa pokryli rozne platformy a zachovala historicka kompatibilita).

Kvoli interoperabilite vsak v praxi nejaku kontrolu treba mat; a kedze
neexistuje prisna norma, tak je z toho gulas. Samotne
__attribute__((packed)) obvykle staci tam, kde ide o polozky sirky
nasobkov 8 bitov, ale uz ked pride na bitfieldy, tak uz nie, lebo treba
riesit napriklad aj endianitu bitfieldov a uplne presne spravanie pri
presahu bitfieldov cez rozhrania byte/word.

Pochopitelne, ako vsade, kde sa da nieco pokazit, k tomu prispeje aj M$
https://list.hw.cz/pipermail/hw-list/2014-March/453804.html

wek



----- Original Message ---------------
>Pravda, takto to funguje ale myslel jsem, ze 4 je implicitni hodnota, 
>nebo proc to hodilo tu 64b polozku na konec a nzarovnalo s predchozi? 
>Myslel jsem, ze je problem v zarovnani, cekal jsem kdyz uz, ze to treba 
>tmLstSms posune o 4B ale nehodi na konec
>Budu to nekdy muset trosku prostudovat az bude vic casu...
>
>#pragma pack(push, 4)
>
>typedef struct
>{
>     uint32_t id;
>     union
>     {
>         struct
>         {
>             uint8_t ba[SECTOR_FSRECSZ-8];
>         };
>         struct
>         {
>             time64_ms tmLastSms;
>         };
>     };
>     uint32_t crc32;
>} FLASHFSREC;
>
>#pragma pack(pop)
>
>
>Dne 21.03.2018 v 10:03 Miroslav Šinko napsal(a):
>> Skuste zmenit atribut na packed. Funkcia aligned je mierne ina od
>> toho, co chcete dosiahnut.
>>
>> miro
>>
>> 2018-03-21 9:55 GMT+01:00 Jaroslav Buchta <jaroslav.buchta at hascomp.cz>:
>>> BINGO, to bude ono. Ted otazka, co elegantne s tim...
>>> __attribute__ ((aligned (1))) jsem pokusne nacpal vsude (ted neresim, ze by
>>> to treba nefungovalo), ale bez efektu.
>>>



Další informace o konferenci Hw-list