Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
C Timervariable verhält sich nicht wie gewünscht
- Ersteller fanatiXalpha
- Erstellt am
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.
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.
- Registriert
- Aug. 2011
- Beiträge
- 13.558
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?
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.
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:
- Registriert
- Aug. 2011
- Beiträge
- 13.558
Okay, versteh ich....
Dann werde ich es mal ausprobieren.
Wobei ich das Beispiel hier nicht so ganz verstanden habe:
Weil 5-253 ist ja nicht 8 sondern (-)248.
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:
- Registriert
- Aug. 2011
- Beiträge
- 13.558
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
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?
Hab nicht gedacht das er da einfach weiter abzieht -.-
Ich hab C noch nicht so ganz drin
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?
- Registriert
- Aug. 2011
- Beiträge
- 13.558
Ah danke
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.
- Registriert
- Aug. 2011
- Beiträge
- 13.558
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?
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?
Ähnliche Themen
- Antworten
- 14
- Aufrufe
- 816
- Antworten
- 17
- Aufrufe
- 1.312
- Antworten
- 60
- Aufrufe
- 1.399