Bin momentan schon etwas verzweifelt, wie man sich beim oben erwähnten Thema vorstellen kann.
Habe schon ein etwas umfangreicheres Programm geschrieben und hatte bisher keine Probleme mit if-Abfragen etc.
Um mein Problem zu veranschaulichen hier mal mein Code:
So, wie ihr nun sehen könnt ein paar sehr komische if-Abfragen.
Und nun zur Erklärungen dieser komischen if-Abfragen.
Die Variable cnt ist in meinem Programm unter bestimmten Voraussetzungen auf 11. Serial.println bestätigt mir das.
Nun zu den Punkten:
Ins cnt == 11 geht er absolut NIE
In das extrem lange if else geht er. ABER(!) sobald ich die Abfrage für cnt == 11 herausnehme geht er nicht mehr in das lange if else
Hab ich das cnt == 11 von dem langen if else herausgenommen, geht er ins cnt < 11
ins cnt < 0 geht er nie
Mach ich jedoch ein return in mein loop() und mache exakt die gleiche Abfrage (sprich if(cnt == 11)), funktioniert es.
Setze ich die Variable cnt vor den if-Abfragen auf 11, springt er auch sofort in mein erstes if.
Überseh ich irgendwas? Passt die Schleife nicht? Benötige sie nur als Zählschleife (eine andere Zählschleife funktioniert wie sie's soll und wie gesagt ist cnt definitiv auf 11)
Btw: habs auch schon mit switch/case probiert. Genau das gleiche. Funktioniert einfach nicht.
Ich hoffe und bitte um Hilfe. Weiß echt nicht mehr weiter.
Eine Variable auf 0 setzen und dann prüfen, ob sie vielleicht 11 ist?
Du setzt bei Deinem Programm entweder auf Seiteneffekte bei der Programmierung, die Deine Programmierfähigkeiten bei weitem übersteigen, zum Beispiel bei der syntaktisch wie funktionell extrem dubiosen for-Schleife.
Oder Du setzt ganz einfach auf eine Magie, die es in einem deterministischen Programm nicht gibt.
P.S.: Willkommen im Forum!
P.P.S.: Du solltest einen wesentlich defensiveren Programmierstil pflegen, mit Sprachkonstrukten, die Du auch überschaust. Zum Beispiel bei for-Schleifen.
Eine Variable auf 0 setzen und dann prüfen, ob sie vielleicht 11 ist?
Du setzt bei Deinem Programm entweder auf Seiteneffekte bei der Programmierung, die Deine Programmierfähigkeiten bei weitem übersteigen, zum Beispiel bei der syntaktisch wie funktionell extrem dubiosen for-Schleife.
Oder Du setzt ganz einfach auf eine Magie, die es in einem deterministischen Programm nicht gibt.
P.S.: Willkommen im Forum!
P.P.S.: Du solltest einen wesentlich defensiveren Programmierstil pflegen, mit Sprachkonstrukten, die Du auch überschaust. Zum Beispiel bei for-Schleifen.
Du denkst also, wenn ich auf if(cnt == 0) prüfe müsste er in das if gehen?
Dem ist nicht so.
Die for-Schleife funktioniert tadellos, da ist keine schwarze Magie dahinter.
Das bedeutet zudem auch, dass ich dem Serial.println nicht trauen darf, wenn hier 11 ausgegeben wird?
Hast du "cnt < 11" auch durch "cnt <= 11" ersetzt? Weil sonst erreichst du die 11 auch nie.
Noch ein Tipp fürs nächste mal:
Indexvariable innerhalb der for schleife initialisieren, dann meckert auch brav dein compiler, wenn du die Klammern vergisst
TelosNox:
Hast du "cnt < 11" auch durch "cnt <= 11" ersetzt? Weil sonst erreichst du die 11 auch nie.
Noch ein Tipp fürs nächste mal:
Indexvariable innerhalb der for schleife initialisieren, dann meckert auch brav dein compiler, wenn du die Klammern vergisst
for (int cnt = 0; cnt < 11; cnt++)
Habe das Problem jetzt etwas anders gelöst.
Aber warum meinst du, dass er die 11 nie erreicht?
Angenommen cnt = 10. Dann führt er ja nochmal die Schleife aus und erhöht am Ende cnt auf 11.
Dann checkt er die Bedingung und sieht das cnt nicht mehr kleiner 11 ist --> cnt bleibt auf 11.
uwefed:
Ja weil cnt x mal incrementiert wird. Hast Du die Klammern bei der for-Schleife vergessen?
Grüße Uwe
Du meinst die geschwungenen Klammern?
Nein, hab ich prinzipiell nicht gemacht da ich die Schleife ursprünglich nur als Zähl-Schleife verwenden wollte.
Deshalb hab ich sie auch mit einem Strichpunkt abgeschlossen.
Mir ist beigebracht worden, dass man das durchaus so machen kann/darf.
Ist das doch eine schlechte Idee?
holsair:
Aber warum meinst du, dass er die 11 nie erreicht?
Angenommen cnt = 10. Dann führt er ja nochmal die Schleife aus und erhöht am Ende cnt auf 11.
Er initialisiert cnt mit 0, dann checkt er ob die Abbruchbedingung erfüllt ist. Er läuft durch die Schleife und erhöht am Ende. Dann prüft er wieder die Abbruchbedingung für den nächsten Durchlauf u.s.w.
Wenn cnt = 10 durchgelaufen ist und er danach auf 11 erhöht, dann sagt die Abbruchbedingung "11 < 11" und das ist unwahr, also macht er keinen weiteren Durchlauf.
holsair:
Du meinst die geschwungenen Klammern?
Nein, hab ich prinzipiell nicht gemacht da ich die Schleife ursprünglich nur als Zähl-Schleife verwenden wollte.
Deshalb hab ich sie auch mit einem Strichpunkt abgeschlossen.
Mir ist beigebracht worden, dass man das durchaus so machen kann/darf.
Ist das doch eine schlechte Idee?
Danke für die Antworten übrigens
lg
Was bezweckst Du mit der Schleife?
Eine Schleife verwendet man um mehrere gleiche Dinge zu tun und nicht um eine Variable hochzuzählen ohne sie zu verwenden.
Machen kann man das schon, aber Sinn machen tut es darum dennoch nicht.
Diese Forschleife :
for (cnt; temp_data[cnt] == 1000 && cnt < 11; cnt++);
bricht beim ersten Durchlauf ab, da temp_data[cnt] == 1000 höchstwahrscheinlich false ist.
Es sei denn in irgendeinem Code den er uns verheimlicht hat wird das Array mit 1000 auf
allen Elementen initialisiert;
Und dieses Riesen IF im elseZweig schreibt man einfach if ((cnt > 0) && (cnt < 12)) ...