@Nedeljko
Ako pogledas moj prvi post, pri dnu (..."Mozda moze posao da obavi i ova mala prljavstina sa cast-ovanjem"...)
je ponudjeno i to resenje, mada sam naglasio da to nije sasvim zdrava programerska navika, primenjiva na
sve platforme.
Zasto ?
U principu, u zavisnosti od implicitnih zahteva koji poticu negde od DMA kontrolera pa navise, na masi embedded
sistema (ne na x86, tj. PC-jevima, ali u masi drugih slucajeva) postoje alignment zahtevi, tj. da recimo int32_t
bude na memorijskoj adresi cija je vrednost multiple od sizeof(int32_t).
Direktan assignment tipa <promenljiva> = <kastovanje><memorijska adresa> moze da ili izazove trenutan
crash, ili da u promenljivu spakuju nekorektnu vrednost uzetu sa lokacije koja pocinje na prvoj narednoj aligned
adresi (sto ocito nije ono sto se zeli).
Resenje koje ima najbolje pocetne sanse da uvek radi je prost memcpy(&promenljiva, &strukture, brojBajtova).
U ovom konkretnom slucaju, kad je struktura ocito nista vise nego 16-bita, radice bez problema uvek i svugde.
Medjutim....cak i tada nije sve gotovo. U opstijem slucaju u kojem struktura moze da sadrzi gomilu raznih drugih
tipova ili drugih struktura (recimo:
Code:
typedef struct
{
bool b1;
char c1;
char c2;
uint32_t ui1;
uint64_t ui_1;
} nekaStruktura;
ne moze se u potpunosti verovati vrednosti koju vraca sizeof(struktura), jer varira od toga kakav je alignment u
trenutku izvrsavanja.
Alignment obicno funkcionise tako da prilikom kompajliranja prvo ustanovi koji je najveci type upotrebljen u strukturi
(u ovom slucaju uint64_t), pa prema tome prvo align-uje celu strukturu, i ako se eksplicitno ne navede (...pogledati #pragma align...)
zeljeni alignment, desice se da je svaki deo strukture smesten (od bool-a do uint64_t) na medjusobnom razmaku
od 8 bajtova, tako da ce sizeof(nekaStruktura) dati rezultat 5*8 = 40.
Dosta lepo je cela prica objasnjena ovde
http://en.wikipedia.org/wiki/Data_structure_alignment).
Da naglasim jos jednom (sto kazu lepo i u ovom poslednjem linku):
Citat:
x86 architecture originally did not require aligned memory access and still works without it
tj. u slucaju x86 (na PC-ju) ce sve lepo raditi i ovako i onako. Medjutim, taj pristup u principu nije sasvim zdrava programerska navika.