C18 Vergleichsoperator funktioniert nicht

OP #582786
Lesenswert?

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
  {
    ...
  }
}
Persönliche Seite #582802
Lesenswert?

Genaugenommen:
1
#define RPM_LEVEL1 = 10000

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
#define ZIEMLICH_VIEL 12345678UL

  
#582811
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren