Arduino Forum

International => Deutsch => Topic started by: Unirox on Aug 27, 2014, 12:29 am

Title: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: Unirox on Aug 27, 2014, 12:29 am
Hallo :)

Ich habe ein kleines Projekt angefangen, inem ich aus dem Arudino eine kleine Kasse machen, bei der man den 1. und 2. Knopf benutzt um die Anzahl der zwei Getränke zu erhöhen. Der 3. dient dazu, den Preis eines Getränks zu ändern und der 4. dient als Reset, bei dem die insgesammt eingenommenen Bons gezählt werden.

Alles funktionierte einwandfrei, bis ich den Preisändernknopf eingebaut habe.
Wenn man den Knopf drückt ändert sich die Variable "na" von 0 auf 1, damit an den eingegeben Getränkemengen keine änderungen vorgenommen werden. Je öfter man auf den Knopf drückt, desto höher wird der Preis für das später ausgewählte Getränk. Wenn man drei mal auf den Knop gedrückt hat, müsste die Variable "neu" (neuer Preis) auf 2 stehen. Jetzt soll man den 1. oder 2. Knopf drücken, damit der Preis für das Getränk übernommen wird, aber kein Getränk auf die "Quittung" eingetragen wird. Danach setzt sich "na" auf 0 zurück, damit man Getränke auf die "Quittung" schreiben kann. :smiley-sad-blue:

Ich wollte, dass auf dem Display angezeigt wird, wie hoch der Preis wird, dazu muss ich den rest erst ausblenden also habe ich versucht die normale anzeige auszublenden sobald "na" auf 1 ist. Also den Bildschirmteil in eine if oder while abfrage gepackt und gesagt das es angezeigt werden soll solange na = 0 ist. Es wird aber nichts auf dem Bildschirm angezeigt. wenn ich sage dass es angezeigt werden soll, wenn na = 1 ist dann wird was angezeigt, aber ich kann keine Veränderungen vornehmen.
Im serialmonitor wird mir angezeigt, dass na = 0 ist.  :smiley-roll-blue:
Title: Re: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: Peter_n on Aug 27, 2014, 12:33 am
if (na == 0)
if (na == 1)
Title: Re: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: Serenifly on Aug 27, 2014, 12:37 am
Hier machst du es es doch auch korrekt:
Code: [Select]

if(bState == HIGH)


Wieso dann nicht in der nächsten Zeile auch?
Title: Re: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: Manawyrm on Aug 27, 2014, 12:51 am
ein wirklicher Klassiker der Programmierfehler, der auch den Profis ab und zu nochmal passiert.

Warum heult der avr-gcc der Arduino-IDE dabei eig. nicht rum? Die meisten aktuellen C/C++ Compiler werfen bei sowas doch mindestens eine Warnung..
Title: Re: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: sschultewolter on Aug 27, 2014, 01:18 am
Eine If-Anweisung kennt nur ein boolsches Ergebnis. Entweder ist die Bedingung wahr, oder halt falsch.
Werte ungleich 0 sind immer wahr, Werte gleich 0 sind falsch.

Code: [Select]
if(i = 12) // ...;
Der Wert der Zuweisung i=12 ist ungleich 0 und somit wahr.

Code: [Select]
if(i = 0) // ...;
Hingegen ist i=0 nicht wahr.

Einen Fehler/Error muss die IDE bzw der Compiler nicht raushaufen dafür. Eine Warnung wäre aber keinesfalls unangebracht.
Visual Studio drückt sich bei sowas wie folgt aus:
Code: [Select]
suggest parentheses around assignment used as truth value
Title: Re: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: Serenifly on Aug 27, 2014, 01:18 am
Warnungen sind in der IDE abgeschaltet weil im Core zu viele unsauberere Sachen sind.

Es funktioniert weil es diese Kurzform gibt:
Code: [Select]

int test = 5;

if(test)
{
}


Was das gleiche ist wie:
Code: [Select]

if(test == true)


Wenn man also eine Zuweisung in einer if-Abfrage macht wird danach der Wert zurückgelesen. Das hat auch durchaus praktische Anwendungen:
Code: [Select]

const char str[] PROGMEM = "test string";

void setup()
{
Serial.begin(115200);
}

void loop()
{
int index = 0;
while(char c = (char)pgm_read_byte_near(str + index++))
Serial.print(c);

Serial.println();
delay(2000);
}

Title: Re: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: Manawyrm on Aug 27, 2014, 01:19 am
Quote
Warnungen sind in der IDE abgeschaltet weil im Core zu viele unsauberere Sachen sind.

#facepalm

Quote
Visual Studio drückt sich bei sowas wie folgt aus:
suggest parentheses around assignment used as truth value

Jau, genau sowas wär halt praktisch.
Title: Re: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: Serenifly on Aug 27, 2014, 01:23 am
Du kannst das schreiben:
Code: [Select]

if (0 == na)
if (1 == na)


Dann bekommst du einen Fehler wenn du ausversehen = schreibst. Funktioniert aber schon nicht mehr wenn man zwei Variablen vergleicht.
Title: Re: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: uwefed on Aug 27, 2014, 01:44 am

Warum heult der avr-gcc der Arduino-IDE dabei eig. nicht rum? Die meisten aktuellen C/C++ Compiler werfen bei sowas doch mindestens eine Warnung..

Weil die Arduino IDE alle Warnings unterdrückt.

Und "if(a=1)" ist ja auch ein gültiger C-Code, auch wenn wenig sinnvoll.
Grüße Uwe
Title: Re: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: Manawyrm on Aug 27, 2014, 01:45 am
Quote
Und "if(a=1)" ist ja auch ein gültiger C-Code, auch wenn wenig sinnvoll.

Deswegen ja eine Warnung und kein Error ;)
Title: Re: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: sschultewolter on Aug 27, 2014, 02:00 am
Naja, ob es zwingend angemerkt werden muss, weiß ich nicht. Solche Fehler werden doch spätestens bei Debuggen enttarnt.
Title: Re: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: michael_x on Aug 27, 2014, 09:53 am

Code: [Select]

int test = 5;
if(test)
{
}


Was das gleiche ist wie:
Code: [Select]

if(test == true)



Einspruch, Euer Ehren !

Das ist nur fast das gleiche.

Code: [Select]
if (5 == true)
  Serial.println("Das würde mich sehr wundern!")
if (5)
 if(true)
    Serial.println("Das hier wird natürlich ausgeführt");


Mit deiner eigentlichen Aussage hast du natürlich recht.

Nachtrag:
12:18 AM  war kurz nach eins nachts ( in MESZ ), das ist mir jetzt auch aufgefallen
Title: Re: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: Serenifly on Aug 27, 2014, 10:51 am
Uh, ja, jetzt wo du es sagst, test ist natürlich != 1  :smiley-roll:  :~

Da wird es dann etwas verwirrend da if(test) trotzdem als boolscher Ausdruck ausgewertet wird und dann true ist, da wie oben gesagt alles ungleich 0 true ist. Es sein denn man schreibt direkt == true :p
Title: Re: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: Unirox on Aug 27, 2014, 12:58 pm
Danke an alle :)

Code: [Select]
if(na == 1)

war das was mir geholfen hat :)
Was so ein zeichen alles ausmachen kann  XD
Title: Re: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: olf2012 on Aug 27, 2014, 01:21 pm

Quote
Warnungen sind in der IDE abgeschaltet weil im Core zu viele unsauberere Sachen sind.

#facepalm

Quote
Visual Studio drückt sich bei sowas wie folgt aus:
suggest parentheses around assignment used as truth value

Jau, genau sowas wär halt praktisch.



Genau das tut die IDE auch, wenn man "verbose output" in den Einstellungen einschaltet:
Code: [Select]
Functions.ino:641: warning: suggest parentheses around assignment used as truth value
Title: Re: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: sschultewolter on Aug 27, 2014, 02:10 pm
Geht ja doch! Danke für die Info (Karma+). Somit sollte das auch geklärt sein. Ob es vorteilhaft ist, dieses dauerhaft einzuschalten, sei mal dahingestellt.  Da ich nicht glaube, dass jemand mit der Gcc Meldungen immer wirklich was anfangen kann  8)
Title: Re: Variable ist 0 aber wird nicht als 0 erkannt :(
Post by: Addi2438 on Aug 27, 2014, 08:32 pm
Es gibt einen ganz einfachen Trick mit welchem man solche Fehler gleich entarnen kann :D.

Der Trick liegt darin die Argumente zu vertauschen:

Während das hier noch durchgeht und dadurch nicht auffällt:
Code: [Select]
if(test = true) ...

Lässt sich sowas erst garnicht kompillieren:
Code: [Select]
if(true = test) ...

Was aber sehr wohl geht is:
Code: [Select]
if(true == test) ...

Gleiches gilt für Zahlen:
Code: [Select]
if(5 == test) ...

Edit:
Ups zu schnell geantwortet, Serenifly hat gleiches schon paar Post vorher geschrieben  :smiley-red: