Forum: Mikrocontroller und Digitale Elektronik Symbolische Konstanten in anderen Typ umwandeln


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Andreas B. (andreas_b395)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

für meinen WS2812 Treiber habe ich etliche Berechnungen mit dem 
Präprozessor durchgeführt. Danach frage ich ab, ob das Ergebnis der 
Berechnung negativ geworden ist. In den Berechnungen fließt auch die 
Konstante F_CPU mit ein. Auf den Typ der Konstante habe ich leider 
keinen Einfluss, da diese dem Compiler mit übergeben wird.

Für mich ergibt sich folgendes Problem:

Funktioniert:
1
#define F_CPU   5L
2
#define ZAHL    8
3
4
#if ((F_CPU - ZAHL) < 0)
5
#error
6
#endif

Funktioniert leider nicht:
1
#define F_CPU   5UL
2
#define ZAHL    8
3
4
#if ((F_CPU - ZAHL) < 0)
5
#error
6
#endif

Gibt es irgendeine Möglichkeit den Typ der symbolischen Konstante zu 
ändern?

Gruß Andreas

von user (Gast)


Bewertung
0 lesenswert
nicht lesenswert
#define macht nur eine textuelle Ersetzung, somit hat das keinen Typ

von Carl D. (jcw2)


Bewertung
0 lesenswert
nicht lesenswert
Einfach ZAHL mal als 8UL auch schon probiert?

Welcher Compiler?

von Stefan E. (sternst)


Bewertung
0 lesenswert
nicht lesenswert
1
#if (ZAHL > F_CPU)
2
#error
3
#endif

: Bearbeitet durch User
von Andreas B. (andreas_b395)


Bewertung
0 lesenswert
nicht lesenswert
user schrieb:
> #define macht nur eine textuelle Ersetzung, somit hat das keinen
> Typ

In #if Derektiven kann der Präprozessor auch rechnen. Genau da scheint 
es mir so, als würde das Ergebnis als unsigned Interpretiert, sobald 
eine Konstante unsigned ist.

von Markus L. (rollerblade)


Bewertung
0 lesenswert
nicht lesenswert

von Andreas Burnickl (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Carl D. schrieb:
> Einfach ZAHL mal als 8UL auch schon probiert?
>
> Welcher Compiler

Ich nutze GCC. Das funktioniert natürlich auch nicht.

von Andreas Burnickl (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Markus L. schrieb:
> https://gcc.gnu.org/onlinedocs/gcc-3.0.2/cpp_4.html#SEC38

Das Problem gab es hier schon mal für die Kalkulation einer Baudrate. 
Lässt sich nicht lösen. Sobald eine Konstante unsigned ist, ist der 
ganze Ausdruck unsigned. Gibt keine Möglichkeit wieder auf signed zu 
casten.

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
Andreas B. schrieb:
> user schrieb:
>> #define macht nur eine textuelle Ersetzung, somit hat das keinen
>> Typ
>
> In #if Derektiven kann der Präprozessor auch rechnen. Genau da scheint
> es mir so, als würde das Ergebnis als unsigned Interpretiert, sobald
> eine Konstante unsigned ist.

Das ist nicht nur dort so. Auch außerhalb des Preprozessors wird bei 
einer arithmetischen Operation zwischen unsigned int und signed int 
letzterer auch nach unsigned konvertiert und dann die Operation 
vorzeichenlos durchgeführt. Nur kann man außerhalb des Präprozessors 
casten, so dass beide Operanden signed sind. Der Präprozessor kennt aber 
keine Casts, deswegen geht das bei #if nicht.

: Bearbeitet durch User

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]
  • [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.