Re: ich komme mit system.timer() nicht klar! Kategorie: Programmierung (von André H. - 13.02.2005 14:56) | ||
Als Antwort auf ich komme mit system.timer() nicht klar! von CodeXP - 7.02.2005 19:23 | ||
| ||
Hallo CodeXP, Zuerst: Ein "Hallo" oder ähnliches am Anfang eines Postings kann nicht nicht schaden. (Auch ein MfG etc. am Ende nicht) Denn soviel Zeit für Höflichkeit mu� sein ! > es werden viele Zeichen ausgegeben die nicht wie Zahlen aussehen! > > > intvar = -2147483648; > str.putlong(strvar, intvar); > Hier hast Du einen kleinen Bug in den OS-Routinen entdeckt. Das Problem hat aber weder etwas mit dem System-Timer zu tun, noch mit Long-Variablen selbst. Das Problem liegt in VM_STRING_PUT_LONG. Um aus einer Zahl ein String zu machen, mu� diese in Einzelziffern zerlegt werden. Bei negativen Zahlen mu� noch ein Minus vorangesetzt werden. Da man nur positive Zahlen anständig in Einzelziffern zerlegen kann, wird negative Zahl zuvor negiert. Bei -2.147.483.648 gibt es aber einen Sonderfall. Denn bildet man hier das 2er-Komplement, so erhält man wieder dieselbe Negative Zahl, welche dann zu "Sonderzeichen" führt beim erstellen des Strings führt. Sieht man sich das ganze als HEX-Zahl an, so wird auch klar, warum das so ist: 0x80000000 entspricht dem obigen Wert. Mit dem 2er-Komplement wird nun diese Zahl zuerst invertiert, man erhält 0x7FFFFFFF, und anschlie�end 1 hinzuaddiert, was wiederrum 0x80000000 ergibt. Es findet quasi beim Negieren ein �berlauf satt, da es die positive Zahl 2.147.483.648 im 16Bit-Longbereich nicht gibt. Diesen Sonderfall mu� man seperat behandeln. Anders geht es nicht: if <LONGWERT>==0x80000000 <STRING>=<STRING>+"-2147483648"; else str.putint(<STRING>,<LONGWERT>); Die Ausgabe dieser "Sonderzahl" als HEX funktioniert übrigens problemlos: str.putintf(<STRING>,-2147483648,-8); > und hierbei hängt sich C-Control II Station auf: > > > intvar = 2147483647 + 1; > str.putlong(strvar, intvar); > Das hat aber nichts mit der CC2 selbst, sondern mit dem Compiler zu tun. Der Compiler versucht Berechnungen zu optimieren. Er rechnet diese Addition also vorher aus. Dabei kommt 2147483648 heraus. Da dies nichtmehr im Long-Bereich ist, macht der Compiler daraus ein Float. Der Compiler kompiliert nun VM_LOAD_CONST_FLOAT, anschlie�end VM_CAST FLOAT_TO_INT und VM_STORE_LONG. Hier kommt es dann zum FPE INOF, also Floatingpoint-Error Integer Overflow, da die Zahl 2147483648 zu einem �berlauf bei der Umwandlung von Float in Long-Integer führt. Dies erkennt man am Blinkcode der HOST-LED(1x lang, 7x kurz), welche bei der Station nichtvorhanden ist, aber nachgerüstet werden kann. Es ist somit ein Programmierfehler. Die Funktion der Routinen (Compiler und OS) ist hier korrekt. > Was für Probleme können hierbei auftreten? > > > ctmr = system.timer(); > if(_lctmr < ctmr) > { > _lctmr = ctmr + 500; > stports.togLCDlight(); > } > Ich würde sagen, garkeine. Wo soll es hier Probleme geben ? MfG André H. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: ich komme mit system.timer() nicht klar! (von CodeXP - 13.02.2005 20:26) Re: ich komme mit system.timer() nicht klar! (von André H. - 20.02.2005 14:51) Re: ich komme mit system.timer() nicht klar! (von CodeXP - 4.03.2005 4:29) |