Avatar billede hurra Novice
30. november 2012 - 09:20 Der er 1 kommentar og
1 løsning

Token concat

Jeg er i gang med en projekt, hvor jeg skal bruge en tilstands maskine. Der er en hel del enums og funktioner, der alle kommer til at skulle ha dele af samme navn, e.g. har en en enum til at angive den aktuelle tilstand (state_DOWN), og så har jeg nogle funktioner der bliver kørt i tilstands maskinen (enter_DOWN(), running_DOWN(), exit_DOWN()), og så er der tilsvarende en række defines af de symboler der kan sendes til maskine (sym_PRESS_DOWN, sym_RELEASE_DOWN....)

I min kode der skal checke hvilke symboler der skal sendes til maskinen, har jeg en lang liste, med alle symbolerne, der hver især ser nogen lunde ud som følger:

if(!(port & PIN2MASK(SWITCH_PIN_DOWN))) {
  smReceiveSymbol(SMSYM_ENUM_PRESS(DOWN));
  keepRunning = true;
}       
else {
  smReceiveSymbol(SMSYM_ENUM_RELEASE(DOWN));
}   

Når der er copy-pasted 15 gange efter hinanden, skriger det jo efter refactorering :)

De macroer der bliver brugt i ovenstående, ligner alle disse:
#define SMSYM_ENUM(name, type) stsym_##name##_##type
#define SMSYM_ENUM_PRESS(name) SMSYM_ENUM(name, PRESS)

Så jeg vil lave en funktion der pakker det ind, og en macro der kan hjælpe mig med at kalde den funktion.

uint8_t checkInput(uint8_t port, uint8_t mask, symbol_t active, symbol_t inactive) {
  if(!(port & mask)) {
  ...
}   

#define CHECK_INPUT(n) (checkInput(port, PIN2MASK(n), SMSYM_ENUM_PRESS(n), SMSYM_ENUM_RELEASE(n)))

Som jeg så kunne tænke med at kalde sådan her:
  keepRunning |= CHECK_INPUT(DOWN);

Men det virker ikke... Og det er jo egenligt klart nok, når man kikker lidt nærmere på det... Problemer er at jeg kalder en macro, der kalder en macro der skal concat'e argumentet med noget.

Kan jeg løse det problem? Evt hvordan?
Avatar billede hurra Novice
30. november 2012 - 09:35 #1
Høyy... Det virker jo !?!...

Aner ikke hvad jeg har lavet, evt bare clean mit projekt.

Jeg troede mit problem var at SMSYM_ENUM_PRESS() fik inputtet 'n', og dermed prøvede at concatte 'n', i stedet for 'DOWN', som er inputtet til CHECK_INPUT().
Avatar billede hurra Novice
30. november 2012 - 09:36 #2
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester