Forum: Compiler & IDEs Overflow bei uint16_t


von Thomas L. (tom)


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?

von Thomas L. (tom)


Lesenswert?

Achja - das gilt natürlich wenn ich als Schwelle beispielsweise 65535
annehme ...

von Thomas L. (tom)


Lesenswert?

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.

von Markus (Gast)


Lesenswert?

Interessant ist auch folgendes:

uint8_t i;

for (i=0; i<=255; i++)
{
  printf("%d ",i);
}

von Thomas L. (tom)


Lesenswert?

???

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Es geht in diesem Wertebereich einfach mal nicht.

Vielleicht holst du ja'n Stück weiter aus und beschreibst, was
du damit anfangen willst?

von Thomas L. (tom)


Lesenswert?

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 :)

von Markus (Gast)


Lesenswert?

> ???

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.

von Thomas L. (tom)


Lesenswert?

ja ... das weiss ich eh .. das habe ich oben eh schon geschrieben :)

bin eh schon dran eine lösung zu basteln :)

von Detlef _. (detlef_a)


Lesenswert?

vielleicht casten
if (((uint32_t)currentValue + 10) > schwelle)

oder nen Überlauf erkennen
if (((currentValue + 10 ) > schwelle    )||
    ( currentValue  + 10  <currentValue )||
    ((currentValue      ) > schwelle    )
)

Cheers
Detlef

von Stefan (Gast)


Lesenswert?

Differenz ist schon richtig
1
if (delta < schwelle - current)
2
   current += delta;
3
else
4
   current = schwelle;

von Detlef _. (detlef_a)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

Sorry mein Fehler. Ich hatte nicht alle Beiträge gelesen und schwelle
gleich - wie nennt ihr es, MaximalWert (65535) - angenommen.

von Stefan (Gast)


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.

von Detlef _. (detlef_a)


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

von Stefan (Gast)


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.

von Thomas L. (tom)


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.

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
Noch kein Account? Hier anmelden.