If-Verzweigung scheitert?!

Moin,

jemand eine Idee, warum hier nicht in den IF-Zweig gegangen wird??

void driveTo(struct GeoLoc &loc, int timeout) {
/bla bla/
GeoLoc coolerLoc = checkGPS();
Serial.println("bluetooth.listen...");
bluetoothSerial.listen();

Serial.print("Aiming... from coolerLoc: ");
Serial.print(coolerLoc.lat); Serial.print(":");
Serial.println(coolerLoc.lon);
if(enabled = true) Serial.println("Killswitch auth. enabled");
if(enabled = false) Serial.println("Killswitch auth. denied");

//bis hier werden Lat und Lon als float und auch enabled als true erkannt

Serial.println("Looptest"); // auch noch ok

// aber hier bleibt es jetzt ohne Ausgabe?!?!

if ((coolerLoc.lat != 0) && (coolerLoc.lon != 0) && enabled) {
Serial.println("require ok");
}

//Kontrollausgabe der Variablen anschließend passt wieder:

Serial.print("cooler Lat Lon ");
Serial.print(coolerLoc.lat);Serial.print(":");
Serial.println(coolerLoc.lon);
if(enabled = true) {Serial.println("enabled");}
if(enabled = false){Serial.println("disabled");}
Serial.println("Looptest end");

Ich bin zwar Anfänger, aber [...]&& enabled[...] was? Wie soll enabled denn sein, damit If printet?

Oder versteh ich das nur noch nicht?

Ich würde ja "&& (enabled = true)" oder natürlich false, schreiben.

Gruß

MiReu

@ Teletrabi Setz deine Programm doch bitte in Code Tags, im Editor oben links! So ist für alle besser ersichtlich das es sich um ein Programm handelt.

Danke Joe

Ich bin zwar Anfänger, aber [...]&& enabled[...] was? Wie soll enabled denn sein, damit If printet?

Das passt schon.

Ich würde ja "&& (enabled = true)" oder natürlich false, schreiben.

Damit würde es falsch werden!
Kein Vergleich, sondern eine Zuweisung.

combie:
Das passt schon.
Damit würde es falsch werden!
Kein Vergleich, sondern ein Zuweisung.

Vielen Dank, wieder was gelernt :slight_smile:

MiReu:
Vielen Dank, wieder was gelernt :slight_smile:

Tipp:
Damit einen der Kompiler bei solchen Fehlern anschreit, kann man die Argumente vertauschen.

if(enabled == false) // ist wohl so gemeint und damit richtig
if(!enabled) // macht das gleiche
if(false == enabled) // richtig, Parameterumkehr erlaubt
if(enabled = false) // kein Vergleich sondern Zuweisung (unbeabsichtigt)
if(false = enabled) // der Kompiler beschwert sich bitterlich

Also, Konstante nach links!
So kann man diesen = vs. == Tippfehler viel leichter identifizieren.
Das sind recht schwer zu findende Fehler, da das Auge den Code beim lesen repariert und das fehlende = gerne hinzu dichtet.

Es ist für manche im ersten Augenblick ungewohnt die Konstante links zu setzen, oder so vorzufinden, aber mit ein bisschen Übung geht das problemlos.

Warnungen aktivieren hilft auch solche Fehler zu finden. Der Compiler lässt das durchgehen weil Zuweisungen den zugewiesenen Wert zurückgeben. Dafür gibt es auch Anwendungen (eine while-Schleife ausführen solange eine Variable ungleich Null ist). Aber er merkt auch dass das meistens nicht ist was man möchte:

warning: suggest parentheses around assignment used as truth value [-Wparentheses]

Das mit den Klammern in diesem Fall keine Lösung, aber wenn man das liest weiß man was passiert ist

noiasca:
du hast == mit = verwechselt!

if(enabled == false){Serial.println("disabled");}

Danke!
Wald... Bäume... argh

oder kurz:

if(enabled) Serial.println(F("Killswitch auth. enabled"));
if(!enabled) Serial.println(F("Killswitch auth. denied"));

Und gerade weils da hakte wollt ich extra möglichst einfach/fehlersicher herangehen. Aber bei der Abfolge true/false ist dann auch klar, dass er beim printf von true ausgeht und trotzdem anschließend nicht reinspringt.

combie:
Tipp:
Damit einen der Kompiler bei solchen Fehlern anschreit, kann man die Argumente vertauschen.

if(enabled == false) // ist wohl so gemeint und damit richtig
if(!enabled) // macht das gleiche
if(false == enabled) // richtig, Parameterumkehr erlaubt
if(enabled = false) // kein Vergleich sondern Zuweisung (unbeabsichtigt)
if(false = enabled) // der Kompiler beschwert sich bitterlich

Also, Konstante nach links!
So kann man diesen = vs. == Tippfehler viel leichter identifizieren.
Das sind recht schwer zu findende Fehler, da das Auge den Code beim lesen repariert und das fehlende = gerne hinzu dichtet.

Es ist für manche im ersten Augenblick ungewohnt die Konstante links zu setzen, oder so vorzufinden, aber mit ein bisschen Übung geht das problemlos.

Danke, guter Tipp. Zwar nicht so intuitiv zu lesen, aber erscheint recht sinnig.