C - rychly dotaz

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Středa Březen 21 11:25:39 CET 2018


Prave, ze v te puvodni verzi to dopadlo tak, ze struktura mela ne 128 
ale 136B i kdyz by se ta 64b polozka dala zarovnat klidne do predchozi 
struktury tak ji misto toho prodlouzila. 32b dummy prmenna primo pred ni 
nepomohla, je mi to takove zahadne...
Pojmenovat struktury jsem nezkousel, nechci se k polozkam dostavat pres 
dalsi tecky.

Dne 21.03.2018 v 10:57 Josef Štengl napsal(a):
> 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
> _______________________________________________
> 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