![]() |
DEUTSCHE VERSION |
|
![]() |
Links | | | Forums | | | Comments | | | Report news |
![]() |
Chat | | | Polls | | | Newsticker | | | Archive |
![]() |
amiga-news.de Forum > Programmierung > Overflow berechnen | [ - Search - New posts - Register - Login - ] |
-1- | [ - Post reply - ] |
2007-10-14, 13:57 h MaikG Posts: 5172 User |
Gegeben habe ich tv_mics, was ja bei 999999 wieder bei 0 beginnt. Da MaxonBasic ja ohnehin Vorzeichenbehaftete Zahlen verwendet, dachte ich, nimmt man halt den Negativen bereich um das zu kompensieren. Aber bei der Rechnung stimmt was nicht, der Ton hört sich schon ganz gut an aber Teile fehlen sporadisch. Also muss die berechnung falsch sein. code:CONST delaytime%=41 Overflow&=999999-delaytime% Forbid WHILE repeat1&<120001 REM 123 POKEW tr& + tr_node% + IORequestio_Command, TR_GETSYSTIME& junk& = DoIO&(tr&) CopyMem tr& + tr_time%, VARPTR(mytimeval&(0)), 8 a&=mytimeval&(1) IF a&-old&<delaytime% THEN 123 IF a&>Overflow& THEN a&=-(1000000-a&) POKEB MySample&+repeat1&, PEEKB(&hBFE101)-127 INCR repeat1& old&=a& WEND Permit [ - Answer - Quote - Direct link - ] |
2007-10-15, 09:09 h tboeckel Posts: 124 User |
@MaikG: Wie wärs mit timer.device/AddTime() oder timer.device/SubTime()? Da werden alle Über- und Unterläufe der Mikrosekunden korrekt in die Sekunden einbezogen. Für genau sowas sind die Funktionen da. [ - Answer - Quote - Direct link - ] |
2007-10-15, 09:40 h MaikG Posts: 5172 User |
>Wie wärs mit timer.device/AddTime() oder timer.device/SubTime()? Da werden alle Über- und Unterläufe der Mikrosekunden korrekt in die Sekunden einbezogen. Für genau sowas sind die Funktionen da. Das Prog ist Zeitkritisch und das timer.device im allgemeinen sehr langsam. Legentlich GetSysTime erlaubt ein Timing welches schneller als 12000 HZ ist. [ - Answer - Quote - Direct link - ] |
2007-10-15, 11:51 h Holger Posts: 8116 User |
Zitat:...sagt jemand, der CopyMem für 8 bytes aufruft... Ansonsten sieh Dir einfach mal Dein Programm an. Du überprüfst etwas und führst davon abhängig einen Sprungbefehl aus (über ordentliche Schleifenprogrammierung und Poll-Loops wollen wir jetzt mal nicht reden...), und danach überprüfst Du, ob ein Overflow stattgefunden hat. Fällt Dir daran etwas auf? mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2007-10-15, 14:53 h MaikG Posts: 5172 User |
>...sagt jemand, der CopyMem für 8 bytes aufruft... Ja okay, das kann man sich wohl auch per peek holen. >Ansonsten sieh Dir einfach mal Dein Programm an. Du überprüfst etwas >und führst davon abhängig einen Sprungbefehl aus Ja. >und danach überprüfst Du, ob ein Overflow stattgefunden hat. >Fällt Dir daran etwas auf? berechnet wird ja ob die neue Variable größer als 999999 werden wird. Ich sehe vom prinzip her keinen Fehler. [ - Answer - Quote - Direct link - ] |
2007-10-15, 16:17 h tboeckel Posts: 124 User |
Zitat: AddTime() macht eigentlich nicht mehr als das hier: void AddTime(struct TimeVal *dest, struct TimeVal *src) { dest->tv_sec = dest->tv_sec + src->tv_sec; dest->tv_usec = dest->tv_nsec + src->tv_usec; if (dest->tv_usec >= 1000000) { // Ueberlauf dest->tv_sec = dest->tv_sec + 1; dest->tv_usec = dest->tv_usec - 1000000; } } Analog für SubTime(). Das ist prinzipiell genau das, was du auch mindestens tun mußt. Wenn das bereits zu langsam ist, dann solltest du besser sofort aufhören. Du kannst gerne das Rad zum x-ten Male erfinden, aber deutlich schneller geht es dadurch immer noch nicht. [ - Answer - Quote - Direct link - ] |
2007-10-15, 18:00 h Holger Posts: 8116 User |
Zitat:"ob die neue Variable größer als 999999 werden wird"?! Kannst Du hellsehen? Ob die neue Variable, bzw. ihr Inhalt größer als 999999 werden wird, also genaugenommen nicht größer, sondern Dank des Überlaufs wieder nahe 0 sein wird, kannst Du gar nicht wissen. Dazu müsstest Du ja wissen, wie lange der Systemaufruf zur Abfrage der aktuellen Zeit dauern wird. Weniger oder mehr als Deine delaytime%, also 41 µs. Woher willst Du das wissen? Ich sehe "vom Prinzip her" durchaus einen Fehler. Und Du hättest nicht gefragt, wenn Du nicht gewusst hättest, dass da ein Fehler ist. Die korrekte Vorgehensweise ist nunmal, nach der Abfrage anhand des Ergebnisses zu überprüfen, ob ein Überlauf stattgefunden hat. Und dann des Ergebnis zu benutzen. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2007-10-15, 18:50 h MaikG Posts: 5172 User |
>AddTime() macht eigentlich nicht mehr als das hier: Ja, okay. Bringt aber nichts. Ich rechne MicsA-MicsB. tv_secs ist unbenutzt. 64 Bit Variablen habe ich leider nicht. >berechnet wird ja ob die neue Variable größer als 999999 werden > wird. Ja, nungut also wenn das goto nicht in 1µ abläuft könnte es trotz der prüfung zu einen Overflow kommen. >Die korrekte Vorgehensweise ist nunmal, nach der Abfrage anhand des >Ergebnisses zu überprüfen, ob ein Überlauf stattgefunden hat. >Und dann des Ergebnis zu benutzen. Ich könnte prüfen ob mics <47, aber daraus dann zu berechnen was vor 0 war und auf wieviel ich jetzt noch warten muss dürfte sehr kompliziert sein. [ - Answer - Quote - Direct link - ] |
2007-10-16, 19:40 h Holger Posts: 8116 User |
Zitat:Mein Gott, Du rufst eine Funktion auf, die Dir genau zwei Zahlen liefert, Sekunden und Mikrosekunden, und wenn die Zahl der Sekunden größer ist als nach dem letzten Aufruf, hat bei den Mikrosekunden ein Überlauf stattgefunden. Was genau ist daran kompliziert? Du machst es erst kompliziert, in dem Du von der normalen Vorgehensweise, bzw. den nächstliegendsten Dingen abweichst und dann, wenn es nicht funktioniert, noch mehr unsinniges hinzufügst, in der Hoffnung, es irgendwie doch zum Laufen zu bewegen. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
-1- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > Overflow berechnen | [ - Search - New posts - Register - Login - ] |
![]() |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2025 by amiga-news.de - all rights reserved. |
![]() |