Forum: Compiler & IDEs Präprozessor #define Vergleich


von Marko B. (glagnar)


Lesenswert?

Hi!

Ich will den Präprozessor einen Wert überprüfen lassen ... leider klappt 
das irgendwie nicht.

1
#define FREQ 2000.0 // CLK frequency for LCD
2
#define OCRVAL (unsigned char)((double)F_CPU/(16.0*FREQ)+1)
3
#if (OCRVAL > 255)
4
#error "The OCR0 value is too large. Increase the prescaler."
5
#endif

Obiges erzeugt folgende unsinnige Fehlermeldung:

"error: missing binary operator before token "char""

Wenn ich im "#if" OCRVAL durch eine Zahl ersetze meckert der Compiler 
nicht mehr. Gibt es eine Möglichkeit per #if einen vom Präprozessor 
berechneten Wert zu vergleichen?

von Sven P. (Gast)


Lesenswert?

Der Präprozessor kennt weder 'unsigned char' noch 'double'.

von Mmmh (Gast)


Lesenswert?

Marko B. schrieb:
> Obiges erzeugt folgende unsinnige Fehlermeldung:

Das ist ein Irrtum Deinerseits. Die Meldung ist nicht unsinnig. Du 
verstehst sie nur nicht.

Marko B. schrieb:
> Gibt es eine Möglichkeit per #if einen vom Präprozessor
> berechneten Wert zu vergleichen?

Ja.

von Marko B. (glagnar)


Lesenswert?

@Sven P.:

Wie kommt es dann, dass die Berechnung einwandfrei funktioniert, nur der 
Vergleich per #if nicht?

von Walter (Gast)


Lesenswert?

weil die Berechnung nicht der präprozessor macht ...

von g457 (Gast)


Lesenswert?

Du hast gleich mehrere Fehler drin:

> #define FREQ 2000.0 // CLK frequency for LCD
                    ^
                    mag der Präprozessor nicht (ohne weiteres) zum
                    rechnen

> #define OCRVAL (unsigned char)((double)F_CPU/(16.0*FREQ)+1)
                  ^        ^      ^
                  damit kann der Präprozessor nix anfangen - also
                  ungut für #if und co.

> #if (OCRVAL > 255)
              ^
              einen unsigned char auf '> 255' zu überprüfen ist
              reichlich.. ähm.. ungünstig

Hier mal ein Beispiel, wies 'richtig' ist (respektive funktioniert):
1
#define F_CPU 8000000UL
2
3
#define FREQ 2000 // CLK frequency for LCD
4
#define OCRVAL (F_CPU /(16 *FREQ) +1)
5
#if (OCRVAL > 255)
6
#error "The OCRVAL value is too large. Increase the prescaler."
7
#endif

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.