[elektro] C kérdés
hg12345
hg12345 at freemail.hu
Wed Sep 23 18:03:01 CEST 2009
Ha jól értem közvetlen cimzést szeretnél a int változón belül:
Erre való a következő macrók, ezekkel bármely cím kinyerhető és bármilyen eltolással egy megfelelő
típust hozzárendelhetsz.
a castolásban beírható az unsigned ha szükséges
#define BYTEMASK(v,n) (((char*)&v)[n])
#define WORDMASK(v,n) (((short*)&v)[n])
#define DWORDMASK(v,n) (((long*)&v)[n])
Hi
"Ágó István" <ago.istvan at gmail.com> írta:
> Üdv mindenkinek
>
> Kellene csinálni egy makrót egy változó adott bitjének vizsgálatára, de
> minél gyorsabb kellene, hogy legyen, mert sokszor fut le sok darab belőle
> egymás után. A változó 16 bites tipus, az egyszerű if (valtozo&(1<<bit))
> sajnos nem ad optimális kódot. Ha viszont castolom a változót és a megfelelő
> "részre" használom az &(1<<bit) műveletet, akkor már azt kapom, amit
> szeretnék. Tehát valami ilyesmire lenne szükségem:
>
> #define bit_test(valtozo,bit) (#if (bit>7) (*((unsigned
> char*)((&valtozo)+1))&(1<<(bit-8))) #else (*((unsigned
> char*)valtozo)&(1<<bit)) #endif)
>
> Tehát ha b értéke nagyobb mint hét, akkor a valtozo felső bájtján végezzen
> &(1<<(bit-8)) műveletet, ha viszont kisebb mint hét, akkor az alsó bájtján
> &(1<<bit) műveletet. Használata egyszerűen if (bit_test(valtozo, bit))
> formában lenne. Csakhogy a fentit nem fogadja el a fordító (C18), egyszerűen
> syntax errorral honorálja. bit értéke a kódban fix szám, tehát nem futás
> közban akarok oda valamit berakni, hanem a preproceszor már ismert számmal
> dolgozna. Természetesen berakhatnám minden sorba az odavaló bitvizsgálatot,
> de az bántja a szememet :-)
> -----------------------------------------
> elektro[-flame|-etc]
More information about the Elektro
mailing list