[AVR/C++] Ruzie met preprocessor

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • TommyboyNL
  • Registratie: Januari 2006
  • Niet online
Het volgende stukje code levert de volgende error op: "error: expected unqualified-id before 'else'", het regelnummer klopt echter van geen kant.

code:
1
2
3
4
5
6
7
8
//#define klimaatcontroller
#if (defined klimaatcontroller)
  if (FIFOFull(temp_buff)||(sensortype==2)) {
#else
  if (FIFOFull(temp_buff)) {
#endif
    blah;
  }


Volgens mij zou dit gewoon goed moeten werken, aangezien na de preprocessor slechts één van mijn if-statements over blijft. Ik krijg het echter niet werkend, en zit met mijn handen in het haar. Wat zie ik over het hoofd?

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Als het regelnummer niet naar dit stukje code wijst, zit de fout dan niet gewoon eerder of later ergens? Mist er niet ergens een }?

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Moet het niet #if defined(klimaatcontroller) zijn?

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

  • TommyboyNL
  • Registratie: Januari 2006
  • Niet online
Als ik bovenstaande code vervang door het volgende stukje, compileert de boel wel succesvol, en werkt de boel ook zoals zou moeten (afgezien van de functionaliteit die de bovenste define aan moet zetten natuurlijk):
code:
1
2
3
4
//#define klimaatcontroller
  if (FIFOFull(temp_buff)) {
    blah;
  }


Het enige verschil zijn de preprocessor statements en de alternatieve "if" regel.
Ook als ik de code uit mijn startpost gebruik en één van de twee if-statements comment, compileert de boel goed.

@eek:
Volgens mij niet, zoals het hierboven staat, staat het op andere plekken in mijn code ook, waar het prima lijkt te werken. Daat gaat het echter om variabelen die al dan niet nodig zijn, en niet om het kiezen van verschillende if-statements.

[ Voor 8% gewijzigd door TommyboyNL op 20-03-2015 20:11 ]


Acties:
  • 0 Henk 'm!

  • Gleighton
  • Registratie: November 2008
  • Niet online

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Doe maar niet; cppreference.com is betrouwbaarder.

De fout in het stukje code is een haakje op de verkeerde plek, dat moet zijn: #if defined (klimaatcontroller)

De foutmelding over "else" zit uiteraard ergens anders, vandaar ook dat het regelnummer niet klopt. De code in de TS bevat nota bene niet eens een "else" maar alleen een "#else".

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • TommyboyNL
  • Registratie: Januari 2006
  • Niet online
Bedankt voor alle tips. Ik heb geprobeerd met de plaats van de haakjes te spelen, wat geen oplossing gaf. Ook #ifdef gebruiken in plaats van "#if defined" leverde geen oplossing. Uiteindelijk heb ik het zo opgelost:
code:
1
2
3
4
5
6
7
8
//#define klimaatcontroller
  if (FIFOFull(temp_buff)
#ifdef klimaatcontroller
  ||(sensortype==2)
#endif          
  ) {
    blah;
  }

Ik ben er niet heel happy mee aangezien de leesbaarheid belabberd is (en ik HAAT WORN-code), maar het werkt ten minste.

Acties:
  • 0 Henk 'm!

  • Rmg
  • Registratie: November 2003
  • Laatst online: 17:56

Rmg

code:
1
2
3
4
5
#ifdef klimaatcontroller
    if (FIFOFull(temp_buff)||(sensortype==2)) {
#else
    if (FIFOFull(temp_buff)) 
#endif


waarom geen ifdef gebruiken? :?

[ Voor 9% gewijzigd door Rmg op 23-03-2015 14:26 ]


Acties:
  • 0 Henk 'm!

  • TommyboyNL
  • Registratie: Januari 2006
  • Niet online
Rmg schreef op maandag 23 maart 2015 @ 14:21:
code:
1
2
3
4
5
#ifdef klimaatcontroller
    if (FIFOFull(temp_buff)||(sensortype==2)) {
#else
    if (FIFOFull(temp_buff)) 
#endif


waarom geen ifdef gebruiken? :?
TommyboyNL schreef op maandag 23 maart 2015 @ 12:53:
Ook #ifdef gebruiken in plaats van "#if defined" leverde geen oplossing.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 14-10 00:53
Je gebruikt nu toch ook #ifdef? Je doet iets fout, maar ik zie het zo niet. Hoe ziet klimaatcontroller er uit? Undef je 'em ergens?

Om de leebaarheid te vergroten kun je de voorwaarde natuurlijk ook naar een (inline) functie of macro halen en daar het conditionele stuk in doen, dat leest al heel wat prettiger in je 'main flow'.

[ Voor 50% gewijzigd door farlane op 23-03-2015 15:38 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:34

.oisyn

Moderator Devschuur®

Demotivational Speaker

MSalters schreef op zondag 22 maart 2015 @ 00:54:
Doe maar niet; cppreference.com is betrouwbaarder.

De fout in het stukje code is een haakje op de verkeerde plek, dat moet zijn: #if defined (klimaatcontroller)
Nope. De defined operator vereist geen haakjes. En uiteraard mag je sowieso haakjes om de gehele expressie zetten.
If the expression contains unary operators in form defined identifier or defined (identifier), it is evaluated first. The result is 1 if the identifier was defined as a macro name and 0 otherwise.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • TommyboyNL
  • Registratie: Januari 2006
  • Niet online
Hoe de rest van mijn programma er uitziet is volgens mij niet van belang. Dit is de eerste keer dat ik in mijn main loop preprocessor commando's gebruik.
Het maffe is dat volgens mij beide stukken code hieronder het zelfde (werkende) resultaat op moeten leveren (eveneens met de allereerste regel uncommented), maar dat dus niet doen.
code:
1
2
3
4
5
6
7
8
//#define klimaatcontroller
#ifdef klimaatcontroller
  if (FIFOFull(temp_buff)||(sensortype==2)) {
#else
  if (FIFOFull(temp_buff)) {
#endif
    blah;
  }


code:
1
2
3
4
5
6
7
8
//#define klimaatcontroller
  if (FIFOFull(temp_buff)
#ifdef klimaatcontroller
  ||(sensortype==2)
#endif          
  ) {
    blah;
  }

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 14-10 00:53
Het zou ook hetzelfde moeten opleveren, daarom denk ik dat het probleem ergens anders zit.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • TommyboyNL
  • Registratie: Januari 2006
  • Niet online
Ik heb volgens mij wel wat preprocessor directives genest, kan dat het probleem zijn?

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 14-10 00:53
Nee, tenzij er iets fout gaat met de nesting. Kun je wat meer code posten?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1