Go Down

Topic: Variable ist 0 aber wird nicht als 0 erkannt :( (Read 4408 times) previous topic - next topic

Unirox

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:

Peter_n

#1
Aug 27, 2014, 12:33 am Last Edit: Aug 27, 2014, 12:35 am by Peter_n Reason: 1
if (na == 0)
if (na == 1)

Serenifly

Hier machst du es es doch auch korrekt:
Code: [Select]

if(bState == HIGH)


Wieso dann nicht in der nächsten Zeile auch?

Manawyrm

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

sschultewolter

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
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Serenifly

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);
}


Manawyrm

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.

Serenifly

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.

uwefed


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

Manawyrm

Quote
Und "if(a=1)" ist ja auch ein gültiger C-Code, auch wenn wenig sinnvoll.

Deswegen ja eine Warnung und kein Error ;)

sschultewolter

Naja, ob es zwingend angemerkt werden muss, weiß ich nicht. Solche Fehler werden doch spätestens bei Debuggen enttarnt.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

michael_x

#11
Aug 27, 2014, 09:53 am Last Edit: Aug 27, 2014, 10:05 am by michael_x Reason: 1

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

Serenifly

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

Unirox

Danke an alle :)

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

war das was mir geholfen hat :)
Was so ein zeichen alles ausmachen kann  XD

olf2012


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

Go Up