Hallo :) Wieder mal ein kleines Problem. Angenommen ich habe eine Variable vom Typ uint16_t. Zu dieser will ich laufend einen Wert - sagen wir der Einfachheit halber mal 10 - hinzuzählen. Ausserdem will ich überprüfen, ob der Wert eine Schwelle überschreitet. Hätte ich jetzt nach Oben hin mehr Platz, so würde ich es so machen: if ((currentValue + 10) > schwelle) { currentValue = schwelle; // Bleibe bei der Schwelle stehen } Nun bin ich aber etwas limitiert, da ich den uint16_t verwende. Angenommen ich bin auf dem Wert 65530. Wenn ich da nun dieselbe Abfrage mache, dann wäre currentValue + 10 ein Overflow auf 5 (oder so) ... und das wäre natürlich kleiner. Ich hätte also eine Art Endlos-Schleife. Weiss jemand wie man das richtig macht?
Achja - das gilt natürlich wenn ich als Schwelle beispielsweise 65535 annehme ...
ok, ich glaub ich bin irgendwie am schlauch gestanden ... ich probiers mal folgendermaßen: Differenz zwischen MaximalWert (65535) und Schwelle Berechnen. Dann den Step mit dieser Differenz vergleichen.
Interessant ist auch folgendes: uint8_t i; for (i=0; i<=255; i++) { printf("%d ",i); }
Es geht in diesem Wertebereich einfach mal nicht. Vielleicht holst du ja'n Stück weiter aus und beschreibst, was du damit anfangen willst?
Nunja - steht eigentlich eh schon alles oben :) Ich bin grad an der Lösung mit der Differenz dran - eigentlich müsste das so funktionieren .. hoffe ich zumindest :)
> ???
Probiers mal aus, gleiches Problem wie deins, nur mit delta = 1.
-> Ergebnis: Endlosschleife
Das maximale Zahl des Wertebereiches kann man halt nur mit
Einschränkungen nutzen.
ja ... das weiss ich eh .. das habe ich oben eh schon geschrieben :) bin eh schon dran eine lösung zu basteln :)
vielleicht casten if (((uint32_t)currentValue + 10) > schwelle) oder nen Überlauf erkennen if (((currentValue + 10 ) > schwelle )|| ( currentValue + 10 <currentValue )|| ((currentValue ) > schwelle ) ) Cheers Detlef
Differenz ist schon richtig
1 | if (delta < schwelle - current) |
2 | current += delta; |
3 | else
|
4 | current = schwelle; |
Nee, Gegenbeispiel: schwelle=5, current=6, delta=10: für uint16_t ist 5-6=65535, damit ist das if TRUE und current wird 16. Cheers Detlef
Sorry mein Fehler. Ich hatte nicht alle Beiträge gelesen und schwelle gleich - wie nennt ihr es, MaximalWert (65535) - angenommen.
Mit der Vorgabe Schwellenwert und maximaler Wertbereich sind verschiedene Werte:
1 | if ((delta < schwelle - current) && (delta < 65535 - current)) |
2 | current += delta; |
3 | else
|
4 | current = schwelle; |
Das Beispiel schwelle=5 current=6 und delta=10 ist nicht zulässig, da current > schwelle.
> Das Beispiel schwelle=5 current=6 und delta=10 ist nicht zulässig, >
da current > schwelle.
Was issn daran nicht zulässig? Das kann nich mal das Bürgerliche
Gesetzbuch verbieten, bei Algorithmen ist erlaubt, was gefällt. Muß auf
meiner Lösung bestehen (obwohl ich da offengestanden auch nicht so
richtig sicher bin, naja)
Cheers
Detlef
Alles klar, Du darfst auf deiner Lösung bestehen. Dennoch gebe ich zu Bedenken, dass es im Anfangsbeitrag heisst: ---- Ausserdem will ich überprüfen, ob der Wert eine Schwelle überschreitet. (hier die problematische Abfrage ob das der Fall ist und wenn ja) currentValue = schwelle; // Bleibe bei der Schwelle stehen ---- Also ist im gesuchten Algorithmus currentValue maximal gleich schwelle und nicht grösser, so wie in deinem Beispiel.
Soooooo ..... :) Ich habe es jetzt mittels der Differenz - Methode von Stefan gelöst (das war eh auch mein Ansatz ca. 10 min nach dem ersten Posting). Das scheint an sich ganz gut zu funktionieren. Leider habe ich im restlichen Programm noch irgendwo einen Hund drin - aber den werde ich schon noch finden. Daher herzlichen Dank mal an alle Beteiligten.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.