Overflow bei uint16_t

OP #365456
Lesenswert?
• ▲
▼
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?
Gast #365469
Lesenswert?
• ▲
▼
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.
#365470
Lesenswert?
• ▲
▼
> 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
Gast #365471
Lesenswert?
• ▲
▼
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.
OP #365472
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.