Forum: Object-Pascal / Delphi-Language
by himitsu,
16. Jan 2014
Wenn man einfach ignoriert, daß es einen Überlauf geben könnte, dann ist es dennoch verstänglich.
Forum: Object-Pascal / Delphi-Language
by himitsu,
15. Jan 2014
QueryPerformanceCounter scheint aber auch ein paar Macken zu haben.
In dem Testprojekt vom himXML hatte ich das drin und auf meinem neuen i7 gibt das Ding keine verwertbaren Ergebnisse mehr raus, bzw. die Werte (also Count / Freq) stimmten absolut nicht.
z.B. Mehere Sekunden bis Tage ausgerechnet, aber real nur paar Millisekunden gelaufen oder auch mal andersrum.
Woran das lag, hatte ich auf...
Forum: Object-Pascal / Delphi-Language
by himitsu,
15. Jan 2014
Casten muß man bei der Berechung eigentlich nicht. Alle Variablen müssen, während der Berechnung, nur den selben Typ besitzen.
Je nach dem, ob Integer oder Cardinal zum Rechnen verwendet wird, gibt es immer irgendwo einen Überlauf, beim Überreiten von High und Low,
was sich dann aber aufhebt, wenn der Wert danach wieder auf den selben Typ beschnitten wird.
Aber dort wird dann wieder die...
Forum: Object-Pascal / Delphi-Language
by himitsu,
15. Jan 2014
Ja, das geht ... also entweder die Variable auf DWORD/Cardinal ändern oder das Funktions-Ergebnis nach Integer casten.
Aber, wie gesagt, du mußt auch bei den Berechnungen auspassen. (auch wenn da die Wahrscheinlichkeit viel kleiner ist, daß du diesen kleineren Zeitraum auch nochmal triffst, dort nach den fast genau 49.7 Tagen)
Forum: Object-Pascal / Delphi-Language
by himitsu,
15. Jan 2014
Für eine Differenzberechnung reicht GetTickCount doch aus?
Also egal ob der Wert positiv oder negativ ist.
Zusammen mit dem Überlauf bekommt man dennoch immer einen positiven Wert raus, wenn Ende und Start summiert subtrahiert wurden. (solange die zu messende Zeit nicht größer als 2147483647 Millisekunden aka 24.86 Tage wird)
PS: auch bei GetTickCount64 gibt es irgendwann einen Überlauf...
Forum: Object-Pascal / Delphi-Language
by himitsu,
15. Jan 2014
Bei dem expliziten Integer-Cast wird der binäre Wert in der Variable nicht verändert.
Man stellt da nur vor der Zuweisung die Interpretierung des höchsten Bits um, womit dann die Wertebereiche zusammen passen.
Stell dir es so vor:
Delphi erkennt, daß die beiden Typen nicht zusammen passen und macht intern aus deinem
MyInteger := MyCardinal;
ein
Forum: Object-Pascal / Delphi-Language
by himitsu,
15. Jan 2014
Da du ja anscheinend das ganze Projekt mit aktiver bereichsprüfung kompilierst, mußt du halt an solchen Stellen aufpassen.
(oder man deaktiviert an diesen stellen die Bereichsprüfung)
Bei impliziten Casts wird bei dir, vom Compiler, eine Bereichsprüfung eingebaut, während das bei expliziten Casts nicht passiert.
PS: Du mußt nicht nur bei der Zuweisung aufpassen, sondern auch bei der...