Forum: Mikrocontroller und Digitale Elektronik C-Compiler Fehler ???


von Programmierer (Gast)


Lesenswert?

Hallo,

habe ein C-Verständnis Problem. Bin mir nicht Sicher ob meine C-Sytax
fehlerhaft ist, oder ob der Compiler einen Fehler macht?

Mir ist nicht klar warum unten stehender "auskommentierter Code"
nicht zum gleichen Ergebnis führt, wie der "Workaround" ?



 // *** Defines


 #define FALSE             0
 #define TRUE              !FALSE

 #define flag              unsigned char     // fVariable
 #define uchar             unsigned char     // ucVariable





////////////////////////////////////////////////////////////////////

  flag fIO_OutputHighActive=FALSE;
  flag ucStatus =FALSE;

.
.
.

   /* So funktioniert es nicht ???
     if (fIO_OutputHighActive)
        ucStatus != ucStatus;

   */


   // Workaround: So funktioniert es..
   if (ucStatus)
   {
     if (! fIO_OutputHighActive)
        ucStatus = FALSE;
   }
   else
   {
     if (! fIO_OutputHighActive)
        ucStatus = TRUE;
   }


    .

    .

    .


   if (ucStatus) // Setzen, SET, TRUE
    vSetPort();
   else        // Rücksetzen, CLEAR, RESET, FALSE
    vClearPort();

von Christian (Gast)


Lesenswert?

!= ist keine Zuweisung sondern ein Vergleich, also das (negierte)
Äquivalent zu ==. Was Du folglich machen willst, ist ein

ucStatus = !ucStatus;

von Dietmar (Gast)


Lesenswert?

@Programmierer:

Um die Variable bitweise zu invertieren, muß es heißen:

ucStatus = ~ucStatus;

Das Zeichen "!" geht nur bei Vergleichsoperationen, jedoch nicht bei
Zuweisungen.

Gruß

Dietmar

von Christian (Gast)


Lesenswert?

@Dietmar: Komisch, dass bei mir "irgendwas = !irgendwas" immer klappt
und den erwünschten Effekt (togglen von true (d.h. ungleich 0) und
false (d.h. gleich 0)) hat.

von peter dannegger (Gast)


Lesenswert?

Man kann auch ! bei Zuweisungen benutzen, wird aber selten gemacht, da
es ein logischer Operator ist d.h kein bitweiser Operator.

! macht aus dem Wert 0 eine 1, alle andere Werte werden zu 0.

Es macht also etwas völlig anderes als das ~


Peter

von Dietmar (Gast)


Lesenswert?

@Christian:

Habe solche Zuweisung wie:

ucStatus != ucStatus;

bisher nirgends gesehen, und ich wühle mich sehr oft durch fremde
Software, Beispielcodes, usw..

Und, warum geht es nicht???

Habe den Ausdruck i != i gerade in Keil µVision getestet, mit
verschiedenen Werten vorinitialisiert, da tut sich absolut nichts, die
Variable bleibt unverändert.

Gruß

Dietmar

von Walter (Gast)


Lesenswert?

das ist auch keine Zuweisung sondern ein Vergleich ...

Walter

von Dietmar (Gast)


Lesenswert?

ja, anscheinend existiert aber die Meinung, man könne mit diesem
Ausdruck was zuweisen...

Gruß

Dietmar

von Dietmar (Gast)


Lesenswert?

Nochmal:

Man beachte den feinen Unterschied:

ucStatus != ucStatus; --> geht nicht!
ucStatus = !ucStatus; --> invertiert nur das unterste bit!
ucStatus = ~ucStatus; --> invertiert bitweise!

Ist vielleicht schon etwas spät :-)

Gruß

Dietmar

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

>  ucStatus = !ucStatus; --> invertiert nur das unterste bit!

Nein. Definitiv nicht; das würde aus einer 2 eine 3 machen.
Tut es aber nicht, es macht aus 'ner 2 'ne 0.

von Dietmar (Gast)


Lesenswert?

ja ja ja, ist doch schon spät :-)

macht aus allen Werten eine 0, und macht aus der 0 eine 1.

Ists jetzt richtig?

Gruß

Dietmar

von Unbekannter (Gast)


Lesenswert?

ja

von Profi (Gast)


Lesenswert?

@Dietmar:
"Habe solche Zuweisung wie:

ucStatus != ucStatus;

bisher nirgends gesehen"

Ist keine Zuweisung, sondern ein Vergleich, dessen Ergebnis nicht
weiter verwendet wird.
Dieses Ergebnis könntest Du auch zuweisen:

erg = ucStatus != ucStatus;

erg ist dann entweder true oder false.

In C ist es etwas gewöhnungsbedürftig, dass
 - Zuweisungen auch wiederum ein Ergebnis haben
   (a = b = c = 0)  oder
   Deshalb ist der der Ausdruck  if (erg=123){....};
   syntaktisch korrekt, trotzdem er ganz was anderes macht,
   als man erwartet (erg==123), nämlich: 123 ist immer true.
 - Ergebnisse nicht zugewiesen werden müssen:
   int a=123;
   a;
   sollte ebenfalls syntaktisch in Ordnung sein.
   a "hängt einfach in der Luft" und es passiert nichts.

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.