Hallo. ich hab nen PIC18F4585 und programmier ihn mit C18 Compiler. Es tritt bei mir ein seltsames Problem mit dem "<" Operator auf. In der nicht-auskommentierten Version des untenstehenden Codes springt mein controller nicht in den körper der if-anweisung. wohingegen es mit dem gleichheitsoperator funktioniert. hat jemand eine idee? #define RPM_LEVEL1 = 10000 void main (void) { ... //unsigned int rpm = 10000; // funktionierende Version unsigned int rpm = 9000; // nicht-funktionierende Version setRPM(rpm); ... } void setRPM(unsigned int rpm) { //if(rpm==RPM_LEVEL1) // funktionierende Version if(rpm<RPM_LEVEL1) // nicht-funktionierende Version { ... } }
#define RPM_LEVEL1 (10000)
Genaugenommen:
1 | |
ist falsch, da gehört kein Gleichheitszeichen hin. Klammern, wie von Klaus vorgeschlagen, sind bei einem so primitiven Ausdruck nicht nötig. Bedenke übrigens, daß solche Präprozessorkonstanten als int-Werte betrachtet werden; möchtest Du also einen Wert > 32767 deklarieren, so musst Du das Suffix U an die Konstante anhängen (um "unsigned int" zu spezifizieren). Soll der Wert größer als 65535U werden, ist noch das Suffix L zu verwenden:
1 | |
> Bedenke übrigens, daß solche Präprozessorkonstanten als int-Werte > betrachtet werden Nein. Sie sind exakt wie ganz normalen Zahlen im Code. Lexikalische Ersetzung. > Soll der Wert größer als 65535U werden, ist noch das Suffix L zu > verwenden: Unnötig. Soviel eigene Intelligenz darfst du dem Compiler durchaus zumuten. Erst bei den "long long" Varianten weist GCC vorsorglich darauf hin.
hallo. das "=" im #define war nur ein tipfehler hier im forum. die zahlen sind kleiner als 13000.
Eben. Und "ganz normale Zahlen im Code" ohne spezifische Suffixe sind ints.
> Und "ganz normale Zahlen im Code" ohne spezifische Suffixe sind ints.
Nein. Sie sind das, was für die korrekte Darstellung mindestens
erforderlich ist, mindestens aber "int".
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.