mikrocontroller.net

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


Autor: Programmierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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();

Autor: Christian (Gast)
Datum:

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

ucStatus = !ucStatus;

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist auch keine Zuweisung sondern ein Vergleich ...

Walter

Autor: Dietmar (Gast)
Datum:

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

Gruß

Dietmar

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.