mikrocontroller.net

Forum: Compiler & IDEs Präprozessor #define Vergleich


Autor: Marko B. (glagnar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

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

#define FREQ 2000.0 // CLK frequency for LCD
#define OCRVAL (unsigned char)((double)F_CPU/(16.0*FREQ)+1)
#if (OCRVAL > 255)
#error "The OCR0 value is too large. Increase the prescaler."
#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?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Präprozessor kennt weder 'unsigned char' noch 'double'.

Autor: Mmmh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marko B. (glagnar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sven P.:

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

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weil die Berechnung nicht der präprozessor macht ...

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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):
#define F_CPU 8000000UL

#define FREQ 2000 // CLK frequency for LCD
#define OCRVAL (F_CPU /(16 *FREQ) +1)
#if (OCRVAL > 255)
#error "The OCRVAL value is too large. Increase the prescaler."
#endif

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.