Forum: Mikrocontroller und Digitale Elektronik Bedeutung der Warnung "suggest parentheses around assignment used as truth value [-Wparentheses]"


von Coco J. (Firma: Student) (dathcoco)


Lesenswert?

Schönen guten Abend,

ich habe eine Funktion programmiert, damit ich weniger mit Registern 
arbeiten muss wenn ich mal einen Pin ein oder ausschalten will:
1
   uint8_t port_pin[1];
2
  get_port_pin(pin,port_pin);
3
  switch(port_pin[0]){
4
 /* hier zeigt avrstudio immer hin wenn ich auf die Fehlermeldung klicke*/   case porta: if (mode==HIGH){PORTA |= (1<<port_pin[1]);} if (mode=LOW){PORTA &= ~(1<<port_pin[1]);} break;
5
    case portb: if (mode==HIGH){PORTB |= (1<<port_pin[1]);} if (mode=LOW){PORTB &= ~(1<<port_pin[1]);} break;
6
    case portc: if (mode==HIGH){PORTC |= (1<<port_pin[1]);} if (mode=LOW){PORTC &= ~(1<<port_pin[1]);} break;
7
    case portd: if (mode==HIGH){PORTD |= (1<<port_pin[1]);} if (mode=LOW){PORTD &= ~(1<<port_pin[1]);} break;

ich habe sie bereits getestet, und sie funktioniert. Jedoch verstehe ich 
nicht wieso ich dort immer folgende Warnung bekomme: "suggest 
parentheses around assignment used as truth value [-Wparentheses]"

kleine Nebeninfo:
porta bis portc sind absichtlich klein geschrieben, sie sind defines und 
sind einfach nur Integer Werte von 1-4. get_port_pin schreibt nur in das 
vorher initialisierte Array, in  [0] schreibt es den Port (Wert von 1-4) 
in [1] den dazugehöroten Pin (Wert 0-7)

von J.-u. G. (juwe)


Lesenswert?

coco jack schrieb:
> if (mode==HIGH)
so ist es richtig, es wird ein Vergleich auf Gleichheit vorgenommen.

> if (mode=LOW)
so ist es falsch (zumindest macht es nicht das, was Du möchtest), da 
hier eine Zuweisung erfolgt.

Außerdem:
> uint8_t port_pin[1];

Hier wird ein Array port_pin mit nur einem Element daklariert. Der 
Index dieses einzigen Elemts ist "0". Später greifst Du aber auf

> port_pin[1]

zu.

von Stefan++ (Gast)


Lesenswert?

coco jack schrieb:
> if (mode=LOW)

von Coco J. (Firma: Student) (dathcoco)


Lesenswert?

oh bei dem mode=LOW hab ich wohl nicht aufgepasst..

a

J.-u. G. schrieb:
> Hier wird ein Array port_pin mit nur einem Element daklariert. Der
> Index dieses einzigen Elemts ist "0". Später greifst Du aber auf

da muss ich nochmal nachlesen.. ist ja jetzt schon einige Monate her 
dass ich mal mit Arrays gearbeitet habe :D

von Peter D. (peda)


Lesenswert?

Warum diese Umstände?

Es geht viel einfacher und lesbarer mit meiner sbit.h:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=835728#835728


Peter

von Coco J. (Firma: Student) (dathcoco)


Lesenswert?

das ganze Projekt sollte mir helfen arduino code leichter zu portieren 
;)

Wie ist deins gemacht? mit Funktionen oder makros?

von Karl H. (kbuchegg)


Lesenswert?

coco jack schrieb:
> das ganze Projekt sollte mir helfen arduino code leichter zu portieren

Dann solltst du dich auf jeden Fall erst mal an

   if( ... )
    ...
   else
    ...

gewöhnen.

WElche Werte kann denn dein mode annehmen?
Doch wohl nur HIGH oder LOW. Wenn er nicht HIGH ist, dann muss er LOW 
sein. Die zweite Abfrage ist daher sinnlos, denn entweder mode ist 
gleich HIGH oder er ist es nicht

   if( mode == HIGH )
     ...
   else
     ...

Das spart dann auch einen 2.ten if ein, der nur aus einem Grund 
vorhanden ist: damit man dort noch eine Chance auf Tippfehler hat.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

coco jack schrieb:
1
if (mode==HIGH){PORTA |= (1<<port_pin[1]);} if (mode=LOW){PORTA &= ~(1<<port_pin[1]);}

Wow... Eigentlich mag ich C sehr. Aber ein solches Konstrukt lässt sich 
beim AVR in ganze 4 Assembler-Befehle packen. Soll einer mal sagen, C 
sei immer besser lesbar als Assembler.

von Peter D. (peda)


Lesenswert?

coco jack schrieb:
> Wie ist deins gemacht? mit Funktionen oder makros?

Es sind Macros.
Die Portpins lassen sich damit als Bitvariablen ansprechen, d.h. auf 0 
oder 1 setzen bzw. testen.
Andere AVR-Compiler können das schon von Haus aus.


Peter

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.