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