C makro

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

C makro

OdgovorNapisal/-a peterp » 16 Okt 2017, 11:21

Ker je tukaj precej pametnih glav imam eno vprašanje.

Imam define, kjer prva vrednost pove število bitov, druga vrednost pove za koliko so premaknjeni
Koda: Izberi vse
#define lc_Bcoctet4_TransferMode 2, 5

Rad bi imel dva makroja, ki bi vrnila št. bitov in število mest za premaknitev. Torej
Koda: Izberi vse
LC_BITS(Bcoctet4, TransferMode)
LC_SHIFT(Bcoctet4, TransferMode)
Je kaj takega sploh možno? Prvi korak je združevanje treh stringov, da se dobi pravi define. Drugi korak pa bi moral biti vračilo ustrezne vrednosti. Ampak imam občutek, da se makroji ne evaluirajo 2x.

Ideja je v tem, da se podatki lepše predstavijo.
peterp
 
Prispevkov: 663
Pridružen: 23 Feb 2015, 14:52
Kraj: Maribor
Zahvalil se je: 171 krat
Prejel zahvalo: 112 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 114

Re: C makro

OdgovorNapisal/-a bray » 16 Okt 2017, 11:33

peterp je napisal/-a:Imam define, kjer prva vrednost pove število bitov, druga vrednost pove za koliko so premaknjeni


Hmm...ne razumem. Vsak define ima samo eno vrednost. Če pa uporabiš define kot definicijo za macro pa moraš parametre definirati drugače.
COM port is not dead. It is virtual!
bray
 
Prispevkov: 501
Pridružen: 08 Avg 2016, 22:11
Kraj: Vransko
Zahvalil se je: 191 krat
Prejel zahvalo: 189 krat
Uporabnika povabil: forest70
Število neizkoriščenih povabil: 37

Re: C makro

OdgovorNapisal/-a tilz0R » 16 Okt 2017, 11:44

Sicer ni čist z define-i, ampak efekt je enak, saj so funkcije static inline. Če jih potrebuješ po več delih projekta, napiši funkcije v header-ju.

Koda: Izberi vse
#define lc_Bcoctet4_TransferMode 2, 5

static inline int bits(int a, int b) { return a; }
static inline int shift(int a, int b) { return b; }

#define CONCAT2(a, b)       lc_ ## a ## _ ## b
#define CONCAT(a, b)        CONCAT2(a, b)
#define LC_BITS(name, in)   bits(CONCAT(name, in))
#define LC_SHIFT(name, in)  shift(CONCAT(name, in))

int main(void) {
    int b, s;
    b = LC_BITS(Bcoctet4, TransferMode);
    s = LC_SHIFT(Bcoctet4, TransferMode);
}


Se pred prevajanjem spremeni v:

Koda: Izberi vse
int main(void) {
    int b, s;
    b = bits(2, 5);
    s = shift(2, 5);
}


Ker sta funkciji bits in shift static inline, ju bo compiler "prekopiral", tako da se bosta obnašali kot macro.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1830
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 230 krat
Prejel zahvalo: 517 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: C makro

OdgovorNapisal/-a peterp » 16 Okt 2017, 11:50

Ja tilz0R, nekaj takega sem tudi sam naredil. Malce raziskujem kaj je sploh vse možno narediti.

Recimo ena uporabna stran (vsaj zame).
peterp
 
Prispevkov: 663
Pridružen: 23 Feb 2015, 14:52
Kraj: Maribor
Zahvalil se je: 171 krat
Prejel zahvalo: 112 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 114

Re: C makro

OdgovorNapisal/-a gumby » 16 Okt 2017, 11:57

Mislim, da bo šlo tudi brez vmesnih funkcij. Bom popoldan malo pogledal...
my brain hurts
Uporabniški avatar
gumby
 
Prispevkov: 2591
Pridružen: 14 Jan 2015, 19:49
Kraj: Lendava
Zahvalil se je: 109 krat
Prejel zahvalo: 612 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 63

Re: C makro

OdgovorNapisal/-a tilz0R » 16 Okt 2017, 12:45

Spodnja koda:

Koda: Izberi vse
#define bits2(x, y) x
#define shift2(x, y) y
#define bits(x)             bits2(x)
#define shift(x)            shift2(x)

#define CONCAT2(a, b)       lc_ ## a ## _ ## b
#define CONCAT(a, b)        CONCAT2(a, b)
#define LC_BITS(name, in)   bits(CONCAT(name, in))
#define LC_SHIFT(name, in)  shift(CONCAT(name, in))

#define lc_Bcoctet4_TransferMode 2, 5

int main(void) {
    int b, s;
    b = LC_BITS(Bcoctet4, TransferMode);
    s = LC_SHIFT(Bcoctet4, TransferMode);
}


Proizvede:

Koda: Izberi vse
int main(void) {
    int b, s;
    b = 2;
    s = 5;
}


Kar je točno to kar si hotel.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1830
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 230 krat
Prejel zahvalo: 517 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: C makro

OdgovorNapisal/-a peterp » 16 Okt 2017, 12:49

Bravo tilz0R! To je točno to kar sem iskal. Hvala.
Manjkajoči del pri meni je bil bits2/bits.
peterp
 
Prispevkov: 663
Pridružen: 23 Feb 2015, 14:52
Kraj: Maribor
Zahvalil se je: 171 krat
Prejel zahvalo: 112 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 114

Re: C makro

OdgovorNapisal/-a gumby » 16 Okt 2017, 13:03

tilz0R je napisal/-a:
Koda: Izberi vse
#define bits2(x, y) x
#define shift2(x, y) y
#define bits(x)             bits2(x)
#define shift(x)            shift2(x)

Točno tole čaranje sem imel v mislih... :)
my brain hurts
Uporabniški avatar
gumby
 
Prispevkov: 2591
Pridružen: 14 Jan 2015, 19:49
Kraj: Lendava
Zahvalil se je: 109 krat
Prejel zahvalo: 612 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 63


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: s56rga in 1 gost