Go Down

Topic: Code funktioniert nur manchmal (Read 4858 times) previous topic - next topic

Tommy56

generell keine while schleifen? warum das?
apropos millis(): laufe ich in Probleme nach 50 tagen oder gehts einfach von vorne los?
ist unsigned long lang genug?
Du hast doch schon eine immer wiederkehrende Schleife: loop

Zum millis-Überlauf wurden hier im Forum schon mehrere Diskussionen bis zum endgültigen Beweis geführt. Nutze einfach die Suchfunktion.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Serenifly

im original Programm wurde die if bedingung durch return 0 beendet, das hat mich aber unerwarteter weise nicht  an den anfang von while geworfen, sondern wohl an den anfang der ganzen funktion. wusste nicht wie ich das ohne große änderungen hinbekomme und auf den ersten blick scheint es zu funktionieren.
Du willst einen Zustandsautomaten

Quote
this is c++, the conditions will all be checked until the first one fails the condition, and then it will fall out.
Das ist du falsch verstanden. 'A' || 'B' ist true

Quote
würde do while() gehen?
Denke anders! Komme davon ab irgendwo stehen bleiben zu wollen. Deine Schleife ist loop(). Dann machst du pro Durchlauf nur das was zu tun ist. Oder nichts.

postmaster-ino

Hi

Mit millis() prüfst Du, ob genug Zeit vergangen ist, um den nächsten Schritt zu machen.
Natürlich kannst Du weiterhin while-Schleifen benutzen, nur nicht für's Warten!
Wenn Du millis wie folgt benutzt:
millis()-letzte_Startzeit>=Wartezeit
Passiert auch in 47,batsch Tagen Nichts Außergewöhnliches!
Die Werte sollten alle unsigned (vorzeichenlos) long (32bit) sein, damit der Compiler nicht meckert.
Wenn Dir eine Wartezeit von 255ms reicht, könnte Wartezeit (bzw. klein geschrieben, da man Variablennamen klein beginnt, KONSTANTEN komplett groß und noch ein/zwei Besonderheiten, auf Die man sich Mal geeinigt hat, damit man den Code besser lesen kann) auch den Typ byte bekommen (ist 'von Haus aus' vorzeichenlos) ist 8bit breit und kann Werte von 0...255 annehmen.
Hierbei könnte aber der Compiler meckern, da die Differenz zweier 32-bit-Zahlen mit einer 8-bit-Zahl verglichen werden soll.

Mit Deinem 'A' || 'B' bekommst Du IMMER true, da beide Werte != Null sind und true oder true ist true.

'A' müsste 65 sein (@ ist 64 ;) ), Du kannst also 'A'-'E' mit 65...69 gleich setzen.
Bei den Zahlen, '0' ist 0x30 (hexadezimal, die letzte Ziffer entspricht der Wertigkeit unseres Zahlensystem, nebenbei) oder 48 in Dezimal.
'0'...'9' wäre dann 48...57.

Oder Du benutzt switch case:
Code: [Select]

switch (variable){
  case 'A':
  case 'B':
  ...
  case '7':
    //deinen Code, Der ausgeführt werden soll, wenn die Taste A, B, ..., oder 7 war.
}

WICHTIG hierbei: nach dem Einsprung (dem passendem case) werden ALLE folgenden Befehle abgearbeitet, bis break; gefunden wird, oder die switch-Abfrage zu ende ist.
Wenn also bei 'A' was Anderes als bei 'B' gemacht werden soll, muß am Ende vom 'A'-Bereich ein break; stehen.

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

Serenifly

#18
Mar 08, 2018, 09:05 pm Last Edit: Mar 08, 2018, 09:07 pm by Serenifly
Am kürzesten geht es so:
Code: [Select]

if ((taste >= 'A' && taste <= 'D') || taste == '*' || taste == '#' || (taste >= '0' && taste <= '9') )


Oder so:
Code: [Select]

switch (taste)
{
   case 'A' ... 'D':
   case '0' ... '9':
   case '*':
   case '#':
}



Aber wichtiger ist erst mal den grundlegenden Ablauf des Programms zu ändern hin zu einem Zustandsautomaten. Komplett anders muss es nicht sein. Ein switch/case ist ja da. Das muss nur richtig verwendet werden. Also erst mal auf den aktuellen Zustand abfragen. Und dann - wenn nötig - auf einen Tastendruck.

someuser

puh das muss ich mir morgen mal alles live anschauen.

würde denn:

if (taste == ('A' || 'B' || 'C' || 'D' || '*' || '#' || '0' || '1' || '2' || '3' || '4' || '5' || '6' || '7' || '8' || '9'))
machen was ich denke?


und was macht
Quote
if (taste)
?
auf den ersten blick funktioniert es so wie ich denke und schaltet im richtigen case weiter soblad irgendeine taste gedrückt wird.

michael_x

Quote
würde
if (taste == ('A' || 'B' || 'C' || 'D' || '*' || '#' || '0' || '1' || '2' || '3' || '4' || '5' || '6' || '7' || '8' || '9'))
machen was ich denke?
Natürlich nicht. Wenn ich das richtig sehe, meinst du
if (taste != 0) // wenn irgendeine Taste gedrückt wurde

Tommy56

if (taste == ('A' || 'B' || 'C' || 'D' || '*' || '#' || '0' || '1' || '2' || '3' || '4' || '5' || '6' || '7' || '8' || '9'))
Das widerspricht den Bedingungsregeln.
Andere Tasten hast Du doch überhaupt nicht. Damit ist diese Abfrage sinnlos.
Da sollte if (taste) ausreichen, weil das Keypad 0 (==false) liefert, wenn keine Taste gedrückt wurde.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Serenifly

#22
Mar 08, 2018, 09:24 pm Last Edit: Mar 08, 2018, 09:25 pm by Serenifly
Quote
if (taste)
Macht genau was da steht. 0 ist false und alles ungleich 0 ist true. Das geht in dem Fall weil dir egal ist welche Taste gedrückt würde.

Aber bei sowas mit negativen Zahlen aufpassen, welche auch true sind. Es gibt auch mal Libraries die für "nichts" -1 zurück geben. Bei KeyPad ist es aber 0.

Das ist aber wie gesagt nicht dein Hauptproblem :)

someuser

Quote
Natürlich nicht. Wenn ich das richtig sehe, meinst du
if (taste != 0) // wenn irgendeine Taste gedrückt wurde
ich wollte wenn irgendeine taste gedrückt ist, völlig egal welche, das die bedingung erfüllt ist.

ich will vergleichen steht in der variablen "taste" entweder A oder B oder C usw.

Quote
Es gibt auch mal Libraries die für "nichts" -1 zurück geben.
wegen solcher eventualitäten mit denen ich mich nicht auskenne wollte ich nicht nur
eben genau die Werte nehmen die auch physikalisch exisiteren.
Quote
Das ist aber wie gesagt nicht dein Hauptproblem :)
mein hauptproblem ist eigentlich alles - da fang ich lieber mal ganz unten an zu verstehn^^


Tommy56

Gib Dir doch einfach mal im Loop auf den seriellen Monitor aus, was in taste steht. Dann siehst Du doch ganz einfach, was Deine Lib zurück gibt, wenn keine Taste gedrückt wurde.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

someuser

Quote
Gib Dir doch einfach mal im Loop auf den seriellen Monitor aus, was in taste steht. Dann siehst Du doch ganz einfach, was Deine Lib zurück gibt, wenn keine Taste gedrückt wurde.
hab ich hier und da schon mal gemacht, funzt ganz gut.
mir ging es eher darum zustände zu vermeiden die ich nicht absehen kann.


im moment funktioniert das Programm - hab einfach den goto sprung eine zeile höher vor die if bedingung gemacht - eigentlich zu einfach. mal sehn wies läuft.


Tommy56

Gewöhne Dir Goto gleich wieder ab. Es gibt << 1% an Problemlösungen, in denen ein Goto sinnvoll sein könnte. In allen anderen Anwendung ist es einfach Murks.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

noiasca

OT: Tommy:
Real Programmers aren't afraid to use GOTO's.

bestimmt bekannt, aber das muss jetzt einfach sein ;-)

how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

Tommy56

OT: Tommy:
Real Programmers aren't afraid to use GOTO's.

bestimmt bekannt, aber das muss jetzt einfach sein ;-)
Kenne ich ;)
Aber der Weg vom Neuling zu "Real Programmers" ist sehr weit.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

combie

Ich mag die extreme Ablehnung von Gotos auch nicht.
Denn bei den wenigen Anwendungen, wo es lohnend ist, macht es keinen Sinn, sich den Blick von Dogmen versperren zu lassen.

Gerade endliche Automaten, wie Parser usw. sind potentiell gute Kandidaten für eine Goto Anwendung.


:o  :o  :o  :o  :o


Aber wie immer:
> Wer einmal kapiert hat, wie ein Hammer funktioniert,
> für den sieht jedes Problem, wie ein Nagel aus.
Und das wollen wir doch nicht!
Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

Go Up