C Timervariable verhält sich nicht wie gewünscht

Wenn ich dich richtig verstehe: Die Differenz muss in den Wertebereich von Uint passen? Ja, diese Anforderung hat man aber in jedem Fall, auch wenn man Überläufe extra behandelt.
 
Deshalb erst keine Überläufe erzeugen, indem man einen Datentyp wählt, der groß genug ist.

Ich wollte damit nur sagen (dem TE), dass damit nicht Problem behoben ist.
 
Deshalb erst keine Überläufe erzeugen, indem man einen Datentyp wählt, der groß genug ist.
Nein, es ist ausreichend, einen Datentyp mit einem Wertebereich zu haben, in dem die zu messende Zeitspanne hineinpasst.

Bei einem fortlaufenden Zähler sollte man damit rechnen (außer es ist bekannt, dass das Gerät nach einer bestimmten Zeit ausgeschaltet wird), dass dieser irgendwann das Maximum des Wertebereichs erreicht.

Deshalb sollte man sich auch überlegen, was in diesem Fall passiert und das habe ich vorhin getan. Und wie gezeigt, ist ein Überlauf kein Drama.
 
Danke für eure Hinweise und Meinungen.
Aber ich will das lieber ohne Überlaufen machen.

Ist ein Prototypenaufbau für eine induktive Ladestation und die 50 Tage knackt das Ding locker wenn es dauerhaft am Strom ist.
Zudem ist mir unwohl dabei so riesige Datentypen für eine Variable zu nutzen obwohl das ja nicht zwingend notwendig ist.
Es ist doch nicht zwingend notwendig, oder?

Oder wie ist der Satz zu verstehen?
Ich wollte damit nur sagen (dem TE), dass damit nicht Problem behoben ist.
 
Wenn du die Variablen einfach überlaufen lässt, kannst du keine größeren Timer machen, als der Maximalwert von unsigned int. Wenn du dir sicher bist, dass du nie mehr als ~65 Sekunden brauchen wirst, dann ist das so ok. Ansonsten ist die Lösung die du hattest mit 50 verschiedenen Variablen die voneinander abhängen absolut unschön und "unperformant" (die paar Berechnen sind trotzdem noch nix).

Warum willst du keine größeren Datentypen nehmen? Außerdem sind 64 Bit nun nicht soooo riesig. Und die werden, wie schon gesagt, mehr sein als du jemals hierfür brauchen wirst.

Es ist notwendig, wenn du eine schöne/einfache Lösung willst, die mehr als 65 Sekunden kann.
 
Zuletzt bearbeitet:
Okay, versteh ich....
Dann werde ich es mal ausprobieren.

Wobei ich das Beispiel hier nicht so ganz verstanden habe:
Beispiel (anhand eines uint8):
DIFF_CNT = JETZT_CNT - START_CNT
5 - 253 = 8

Weil 5-253 ist ja nicht 8 sondern (-)248.
 
Zuletzt bearbeitet:
Doch:
Unbenannt.PNG
 
Ah verdammt, ich dachte sobald die 5 "weg sind" hört er auf und bleibt dann bei... 248 stehen. Also wie wenn die Rechnung 253-5 wäre.
Hab nicht gedacht das er da einfach weiter abzieht -.-
Ich hab C noch nicht so ganz drin :D

Das heißt am Ende sieht die Rechnung so aus:
- von b gehen erstmal 5 weg und steht damit bei 248 und a steht bei 0
- und dann geht es einfach weiter 0-248 -> 255-247 usw.

richtig?
 
Am besten ist wohl eine Visualisierung:
Unbenannt.PNG

PS: Das ist übrigens C# und nicht C. Verhalten ist aber gleich.
 
Bagbag schrieb:
Wenn du die Variablen einfach überlaufen lässt, kannst du keine größeren Timer machen, als der Maximalwert von unsigned int. Wenn du dir sicher bist, dass du nie mehr als ~65 Sekunden brauchen wirst, dann ist das so ok. Ansonsten ist die Lösung die du hattest mit 50 verschiedenen Variablen die voneinander abhängen absolut unschön und "unperformant" (die paar Berechnen sind trotzdem noch nix).

Warum willst du keine größeren Datentypen nehmen? Außerdem sind 64 Bit nun nicht soooo riesig. Und die werden, wie schon gesagt, mehr sein als du jemals hierfür brauchen wirst.

Es ist notwendig, wenn du eine schöne/einfache Lösung willst, die mehr als 65 Sekunden kann.

Er kann ja auch uint32 als Zählvariable verwenden, was dann weit mehr als 65 Sekunden wären. Dass man den Überlauf nicht behandeln muss, sollte eigentlich als Tipp zu verstehen gewesen sein. Man muss dafür keine umständliche Lösung programmieren.
 
Den Überlauf muss ich zwar für diese Differenz-Rechnung nicht behandeln.
Aber die Zeitrechnungen mit Modulo kommen dann trotzdem durcheinander, oder?
Also gehen wir mal davon aus ich bleib bei einem einfach unsigned int mit max. 65.535 als Wertebereich.
Beim ersten Mal auslösen für 1Min löst er noch korrekt aus, aber danach ist er immer 5 Sekunden+ zu spät dran, oder?
 
Auf die Idee die 2 Sachen zu kombinieren (Überlauf + uint32) bin ich gar nicht gekommen. Super Idee!

Edit: wenn du mit modulo rechnest geht es in der Tat nicht. Dann wäre 64bit immer noch die beste Lösung.
 
Zurück
Oben