Ich habe in den letzten Tagen eine C-Library nach Pascal übersetzt, und habe sehr lange nach einem Fehler gesucht, es wollte einfach nicht funktionieren. Es stellt sich dann heraus, dass es an einer Berechnung lag, die MODULO verwendet.
In C stand da so etwas wie x=a mod m wobei m auch negativ werden konnte. Da lag der Haken.
Laut Wikipedia gibt es da zwei Varianten, die mathematische und die symmetrische Modulo-Funktion.
C verwendet die symmetrische Variante die a mod m so berechnet: x = a - m(a div m)
Das klappt dann auch mit negativem M. Alle Onlinerechner rechnen so, der Windows-Rechner aber nicht, der macht es wie Avrco.
In C: 5 mod -1 = 0
In C: 5 mod -2 = -1
In C: 5 mod -3 = -1
In C: 5 mod -4 = -3
In C: 5 mod -5 = 0
In Avrco: 5 mod -1 = 0
In Avrco: 5 mod -2 = 1
In Avrco: 5 mod -3 = 2
In Avrco: 5 mod -4 = 1
In Avrco: 5 mod -5 = 0
Avrco macht aus m also ABS(m).
Der Erfolg war, dass sich ein Zähler dann hoch statt heruntergezählt hat, was jedesmal in einen Überlauf mündete. Dank des Hardwaredebuggers konnte ich das nach langem Probieren irgendwann heraus finden.
Das ist eine böse Falle, die vielleicht im Handbuch/Hilfe erwähnt werden sollte wenn es mal wieder aktualisiert wird.
In C stand da so etwas wie x=a mod m wobei m auch negativ werden konnte. Da lag der Haken.
Laut Wikipedia gibt es da zwei Varianten, die mathematische und die symmetrische Modulo-Funktion.
C verwendet die symmetrische Variante die a mod m so berechnet: x = a - m(a div m)
Das klappt dann auch mit negativem M. Alle Onlinerechner rechnen so, der Windows-Rechner aber nicht, der macht es wie Avrco.
In C: 5 mod -1 = 0
In C: 5 mod -2 = -1
In C: 5 mod -3 = -1
In C: 5 mod -4 = -3
In C: 5 mod -5 = 0
In Avrco: 5 mod -1 = 0
In Avrco: 5 mod -2 = 1
In Avrco: 5 mod -3 = 2
In Avrco: 5 mod -4 = 1
In Avrco: 5 mod -5 = 0
Avrco macht aus m also ABS(m).
Der Erfolg war, dass sich ein Zähler dann hoch statt heruntergezählt hat, was jedesmal in einen Überlauf mündete. Dank des Hardwaredebuggers konnte ich das nach langem Probieren irgendwann heraus finden.
Das ist eine böse Falle, die vielleicht im Handbuch/Hilfe erwähnt werden sollte wenn es mal wieder aktualisiert wird.