C - rychly dotaz

Josef Štengl ok1ced na nagano.cz
Středa Březen 21 10:57:45 CET 2018


Abych se přiznal, nechápu o co vám přesně jde. Položky ve struktuře kompilátor obvykle zarovnává dle jejich velikosti na 
hranici jejich zarovnání (to jest 32 bitů na 4, 16 bitů na 2, 64 bitů na 8). Struktury většinou začínají na 8.

Tudíž, pokud máte ve struktuře 32 bitovou položku a následuje 64 bitová položka, tak se mezi těmito položkami vytvoří 4B 
mezera (první položka bude zarovnána obvykle na hranici 8 bytes) A tak podobně pro ostatní velikosti. Pro eliminaci mezer 
(gaps) je třeba zadat výše již zmíněný atribut packed. Struktura (union) zachovává pořadí položek, ale o jejich umístění v 
daném paměťovém bloku rozhoduje kompilátor, tudíž přistupovat ke struktuře jako k poli je poněkud ... zajímavé.

mimochodem, co jste myslel tím, že „proc to hodilo tu 64b polozku na konec a
 > nzarovnalo s predchozi“? Předchozí je id nebo ba? Protože dle

The size of a union is sufficient to contain the largest of its members. The value of at
most one of the members can be stored in a union object at any time. A pointer to a
union object, suitably converted, points to each of its members (or if a member is a bit-
field, then to the unit in which it resides), and vice versa.

by tmLastSms a ba měli mít stejnou adresu. Pokud nemají, tak jsem zase něco blbě pochopil.


Pokud potřebujete přesné pozice v poli (struktuře) položek, tak máte tři možnosti.
a) vytvořit pole a na položky ukazovat pointry (přetypovanými).
b) použít stukturu s packet.
c) použít proměnné a říci linkeru, kam je má umístit (je to dost pracné a závislé na komilátoru).



On 21.3.2018 10:17, Jaroslav Buchta wrote:
> 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 na 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.
>>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
> 
> 
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list