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


von Andreas B. (andreas_b395)


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)


Lesenswert?

#define macht nur eine textuelle Ersetzung, somit hat das keinen Typ

von Carl D. (jcw2)


Lesenswert?

Einfach ZAHL mal als 8UL auch schon probiert?

Welcher Compiler?

von Stefan E. (sternst)


Lesenswert?

1
#if (ZAHL > F_CPU)
2
#error
3
#endif

: Bearbeitet durch User
von Andreas B. (andreas_b395)


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)


Lesenswert?


von Andreas Burnickl (Gast)


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)


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)


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
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.