Error: missing binary operator before token "("

0

Witam,

Mam problem z warunkiem w preprocesorze (kompilator GCC)

Poniższy program działa prawidłowo:

#include <stdio.h>
#define NUMB1 8000000UL 
#define NUMB2 64 

#define RESULT (int)((1778E-6 * NUMB1 / NUMB2 * 0.85)+0.5) 

int main(void) { 
  printf("%d",RESULT); 
  return 0; 
}

obliczając RESULT jako 189.

Gdy chcę dodać reakcję preprocesora (w postaci warningu) na wartość RESULT powyżej 100:

#if RESULT > 100
  # warning "Jakiś tekst ...."
#endif

kompilator generuje błąd:

#include <stdio.h>

#define NUMB1 8000000UL
#define NUMB2 64

#define RESULT (int)((1778E-6 * NUMB1 / NUMB2 * 0.85)+0.5)

#if RESULT > 100
  # warning "Jakiś tekst ...."
#endif

int main(void) {
  printf("%d",RESULT);
  return 0;
}

komunikaty błędów:

prog.c:6:21: error: missing binary operator before token "("
 #define RESULT (int)((1778E-6 * NUMB1 / NUMB2 * 0.85)+0.5)
                     ^
prog.c:8:5: note: in expansion of macro ‘RESULT’
 #if RESULT > 100
     ^

Co robię źle?

0

Najwyraźniej w makrach w C nie może występować castowanie typów, jeżeli jest użyte w konstrukcji #if (nie jestem pewien, lecz tak wynika z tego błędu).

0

Macro wstawia dosłowny kod w dane miejsce czyli z Twojego kodu robi się:

#if (int)((1778E-6 * NUMB1 / NUMB2 * 0.85)+0.5) > 100

A dalej:

#if (int)((1778E-6 * 8000000UL / 64* 0.85)+0.5) > 100

Strzelam, że winowajcą jest to rzutowanie w dyrektywie ;)

Spróboj tak:

#define PRERESULT ((1778E-6 * NUMB1 / NUMB2 * 0.85)+0.5)
#define RESULT  (int)PRERESULT

#if PRERESULT > 100
0

RESULT muszę mieć zaokrąglone stąd rzutowanie.

#include <stdio.h>

#define NUMB1 8000000UL
#define NUMB2 64


#define PRERESULT ((1778E-6 * NUMB1 / NUMB2 * 0.85)+0.5)
#define RESULT  (int)PRERESULT

#if PRERESULT > 100
  # warning "Some text ...."
#endif

int main(void) {
  printf("%d",RESULT);
  return 0;
}

generuje:

prog.c:7:21: error: floating constant in preprocessor expression
 #define PRERESULT ((1778E-6 * NUMB1 / NUMB2 * 0.85)+0.5)
                     ^
prog.c:10:5: note: in expansion of macro ‘PRERESULT’
 #if PRERESULT > 100
     ^
prog.c:7:47: error: floating constant in preprocessor expression
 #define PRERESULT ((1778E-6 * NUMB1 / NUMB2 * 0.85)+0.5)
                                               ^
prog.c:10:5: note: in expansion of macro ‘PRERESULT’
 #if PRERESULT > 100
     ^
prog.c:7:53: error: floating constant in preprocessor expression
 #define PRERESULT ((1778E-6 * NUMB1 / NUMB2 * 0.85)+0.5)
                                                     ^
prog.c:10:5: note: in expansion of macro ‘PRERESULT’
 #if PRERESULT > 100
     ^
0

Preprocesor w C nie operuje na liczbach zmiennoprzecinkowych afair.
Edit: lecz mógłbyś spróbować użyć bibliotek z Boosta: http://stackoverflow.com/questions/3791264/preprocessor-functions-evaluated-at-compile-time-in-c

0

No tak. W preprocesorze nie może być zmiennych typu float. Trzeba się ich pozbyć. Daj mńe sekundę sprawdzę kilka rzeczy. kompilator powinien sam zaokrąglić definicje do int'a

#define NUMB1 8000000
#define NUMB2 64

#define RESULT (1778 * NUMB1 / NUMB2 * 850000)+500000)


#if RESULT > 100 000 000
 .....
0
Patryk27 napisał(a):

Preprocesor w C nie operuje na liczbach zmiennoprzecinkowych afair.

Dlaczego w takim układzie oblicza wartość RESULT prawidłowo?

Ola Nordmann napisał(a):

No tak. W preprocesorze nie może być zmiennych typu float. Trzeba się ich pozbyć. Daj mńe sekundę sprawdzę kilka rzeczy.

Mam całą wolną noc przed sobą :)

0
JakubST napisał(a):
Patryk27 napisał(a):

Preprocesor w C nie operuje na liczbach zmiennoprzecinkowych afair.

Dlaczego w takim układzie oblicza wartość RESULT prawidłowo?

Kompilator oblicza tę wartość, a nie preprocesor.


Mam całą wolną noc przed sobą

Użyj Boosta i będzie po problemie :P

0
Patryk27 napisał(a):

Użyj Boosta i będzie po problemie :P

Niestety nie mogę. Muszę sobie poradzić z gołym GCC.

0
JakubST napisał(a):
Patryk27 napisał(a):

Użyj Boosta i będzie po problemie :P

Niestety nie mogę. Muszę sobie poradzić z gołym GCC.

To wklej sobie źródła Boosta bezpośrednio do swojego kodu ;]
Edit: lub przynajmniej sobie zobacz, jak oni to rozwiązali i napisz coś własnego na tej podstawie.

0

O kurde jaki ruch. Wyedytowałem posta wyżej °.°

0
Ola Nordmann napisał(a):

O kurde jaki ruch. Wyedytowałem posta wyżej °.°

W tym kierunku poszedłem i działa OK.

Dziękuję wszystkim, za pomoc!
Pozdrawiam,
Jakub

1 użytkowników online, w tym zalogowanych: 0, gości: 1