Variable ist 0 aber wird nicht als 0 erkannt :(

Hallo :slight_smile:

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

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

Kasse.ino (1.42 KB)

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

Hier machst du es es doch auch korrekt:

if(bState == HIGH)

Wieso dann nicht in der nächsten Zeile auch?

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

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.

if(i = 12) // ...;

Der Wert der Zuweisung i=12 ist ungleich 0 und somit wahr.

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:

suggest parentheses around assignment used as truth value

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

Es funktioniert weil es diese Kurzform gibt:

int test = 5;

if(test)
{
}

Was das gleiche ist wie:

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:

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

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

#facepalm

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.

Du kannst das schreiben:

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.

Manawyrm:
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

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

Deswegen ja eine Warnung und kein Error :wink:

Naja, ob es zwingend angemerkt werden muss, weiß ich nicht. Solche Fehler werden doch spätestens bei Debuggen enttarnt.

Serenifly:

int test = 5;

if(test)
{
}




Was das gleiche ist wie:


if(test == true)

Einspruch, Euer Ehren !

Das ist nur fast das gleiche.

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

Uh, ja, jetzt wo du es sagst, test ist natürlich != 1 :roll_eyes: :~

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 :stuck_out_tongue:

Danke an alle :slight_smile:

if(na == 1)

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

Manawyrm:

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

#facepalm

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:

Functions.ino:641: warning: suggest parentheses around assignment used as truth value

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)

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:

if(test = true) ...

Lässt sich sowas erst garnicht kompillieren:

if(true = test) ...

Was aber sehr wohl geht is:

if(true == test) ...

Gleiches gilt für Zahlen:

if(5 == test) ...

Edit:
Ups zu schnell geantwortet, Serenifly hat gleiches schon paar Post vorher geschrieben :blush: