mikrocontroller.net

Forum: Compiler & IDEs Overflow bei uint16_t


Autor: Thomas L. (tom)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thomas L. (tom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja - das gilt natürlich wenn ich als Schwelle beispielsweise 65535
annehme ...

Autor: Thomas L. (tom)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interessant ist auch folgendes:

uint8_t i;

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

Autor: Thomas L. (tom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
???

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thomas L. (tom)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas L. (tom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ... das weiss ich eh .. das habe ich oben eh schon geschrieben :)

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

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielleicht casten
if (((uint32_t)currentValue + 10) > schwelle)

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

Cheers
Detlef

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Differenz ist schon richtig
if (delta < schwelle - current)
   current += delta;
else
   current = schwelle;

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit der Vorgabe Schwellenwert und maximaler Wertbereich sind
verschiedene Werte:
if ((delta < schwelle - current) && (delta < 65535 - current))   
   current += delta;
else   
   current = schwelle; 

Das Beispiel schwelle=5 current=6 und delta=10 ist nicht zulässig, da
current > schwelle.

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas L. (tom)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.