bitfield v avr-gcc

Miroslav Sinko sinkomiro@rocketmail.com
Středa Červen 18 10:04:10 CEST 2008


>>> PS. asi si pripraveny na argument ze sizeof/sizeof je silne
>>> neportabilne takze ho ani vytahovat nejdem... ;-)
>>
>>Nie som a ani neviem preco by to malo byt neportabilne. Pocitam, ze nemas
>>na mysli portovanie z jazyka do jazyka, ale z platformy na platformu. 
>>Jedine, co ma napada, ze by si mohol mysliet, je zarovnavanie clenov v 
>>strukturach. Ale to by bol omyl, mam uz nachystany dokaz, ze pri tomto 
>>nie je absolutne ziaden problem. Som pripraveny ho predlozit :-)

>Hmmmm tipujem ze rovno z normy. Mam pocit, ze som nieco take kdesi cital, >takze som dostal sam seba... ;-)

Ano :-)

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.5.3.4 The sizeof operator

3 ..... When applied to an operand that has structure or union type, the result is the total number of bytes in such an object,
including internal and trailing padding.

6 EXAMPLE 2 Another use of the sizeof operator is to compute the number of elements in an array: sizeof array / sizeof array[0]


Pre nazornost som urobil jednoduchy priklad, ktory ukazuje ako to funguje v praxi (kompilovane v MS VC6)

typedef struct{
unsigned char c1;
double d;
unsigned char c2;
}T_TEST;

void test(void){
T_TEST ttest[2];

printf("%d %d %d\n", sizeof(ttest), sizeof(T_TEST), sizeof(ttest)/sizeof(T_TEST));

memset(ttest, 0xAA, sizeof(ttest));

ttest[0].c1=1;
ttest[0].d=3.14;
ttest[0].c2=2;

ttest[1].c1=3;
ttest[1].d=0.69;
ttest[1].c2=4;

for(int i=0; i<sizeof(ttest); i++)
   printf("%.2X ", *(((unsigned char*)ttest) + i));

}


Vystupy:

-jeden extrem, zarovnavanie clenov v strukturach 1 byte:

20 10 2
01 1F 85 EB 51 B8 1E 09 40 02 03 14 AE 47 E1 7A 14 E6 3F 04

-druhy extrem, zarovnavanie clenov v strukturach 16 bytov:

48 24 2
01 AA AA AA AA AA AA AA 1F 85 EB 51 B8 1E 09 40 02 AA AA AA AA AA AA AA 03 AA AA AA AA AA AA AA 14 AE 47 E1 7A 14 E6 3F 04 AA AA AA AA AA AA AA


miro




>wek



      



Další informace o konferenci Hw-list