Forum: Mikrocontroller und Digitale Elektronik C18 Vergleichsoperator funktioniert nicht


von Edi _. (edi_2k)


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

von Klaus F. (kfalser)


Lesenswert?

#define RPM_LEVEL1  (10000)

von Rufus Τ. F. (rufus) Benutzerseite


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

  

von Andreas K. (a-k)


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.

von Edi _. (edi_2k)


Lesenswert?

hallo.

das "=" im #define war nur ein tipfehler hier im forum.
die zahlen sind kleiner als 13000.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Eben. Und "ganz normale Zahlen im Code" ohne spezifische Suffixe sind 
ints.

von Andreas K. (a-k)


Lesenswert?

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

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.