Hallo, ich habe schon das Forum durchstöbert aber keine Lösung gefunden. Ich möchte eine 4-stellige Dezimalzahl in die einzelnen Ziffern zerlegen. Habe mal irgendwo eine "Bitmanipulation" als Ersatz für die Division durch 10 gesehen, leider finde ich es nicht wieder. Wer hat eine Lösung? Atmega 16 mit AVR Studio in C. Gruß Marc Besten Dank im voraus.
Marc Höner schrieb: > Atmega 16 mit AVR Studio in C. Division und Modulo gibts doch in C. Da brauchste keinen Ersatz :-)
Such mal in der Codesammlung nach Beispielen, wie die Dezimalzahlen auf einem Display ausgeben. Da wird dies z.B. verwendet
Ich denke mal du erinnerst dich da an die Division bzw Multiplikaion durch bitweises verschieben. Das funktioniert aber nur für Potenzen von zwei Also z.B. 12 * 2 = 12 << 1 12 * 4 = 12 << 2 12 * 8 = 12 << 3 12 * 16 = 12 << 4 usw. Division ist dann eben genau andersrum. Wie auch immer - für die 10 funktioniert das so ohne weiters nicht.
Besten Dank für die vielen Antworten. Die einfache Version mit / und % funktioniert leider nicht. Irgendwie scheint es bei der Division zu Ungenauigkeiten zu kommen. Im Moment scheint mir der Tipp von Peter der vielversprechendste zu sein. Vielen Dank für eure Hilfe Gruß Marc
Marc Höner schrieb: > Besten Dank für die vielen Antworten. > Die einfache Version mit / und % funktioniert leider nicht. Irgendwie > scheint es bei der Division zu Ungenauigkeiten zu kommen. Ungenauigkeiten? Bei einer Integer Division? Du beliebst zu scherzen. Zeig mal. (Ich lehn mich mal aus dem Fenster und behaupte du hast Flieskomma im Spiel und keine Rundungskorrektur gemacht)
Karl Heinz Buchegger schrieb: > Ungenauigkeiten? > Bei einer Integer Division? War früher in der Schule auch immer so. Der Lehrer hat das dann auf "6 setzen!" korrigiert ;-) MfG Klaus
Hier der Code: switch (xpdr_cursor) { case 1: value = xpdr_code/1000; break; case 2: value = xpdr_code/100; value = value%10; break; case 3: value = xpdr_code/10; value = value%10; break; case 4: value = xpdr_code%10; break; default: break; xpdr_code ist max 4-stellig, soll in seine digits zerlegt werden und ist int16, value ist int8 Fehler habe ich bei case 3 (3. Stelle), hier werden teilweise, aber nicht immer falsche Werte ausgegeben. Das mit der Division war so eine Vermutung, hatte ich mal gehört. Bin nicht so der Experte. Fliesskomma ist allerdings nicht im Spiel. Gruß Marc
Wenn die Division im Compiler – zumal die durch 10 – fehlerhaft wäre, dann wär das schon längst aufgefallen. Der Fehler stekt vermutlich woanders, in der Ausgaberoutine, Glitch, Stacküberlauf, Puffer zu klein... Dein Beispiel lässt sich lzudem nicht übersetzen und nachvollziehen, da es kein gültiger C-Code ist: Keine Deklarationen, etc.
xpdr_cursor ist 8bit unsignedInteger xpdr_code ist 16 bit unsignedInteger value ist 8bit unsignedInteger
Und wie äußert sich der Fehler? Komplett falsche Zahlen oder +/- 1 vom richtigen Wert oder gar etwas Anderes?
Das Problem ist gelöst. Marc Höner schrieb: > case 3: > value = xpdr_code/10; > value = value%10; Der Fehler lag in der Variablendeklaration. Ich habe jetzt value als int16 deklariert und alles klappt. Ist ja auch logisch. Wenn ich eine 4-stellige Zahl durch 10 teile können Werte größer 255 herauskommen. Man muss nur mal drauf gestossen werden. Besten Dank an alle die Tipps gegeben haben. Gruß Marc
Marc Höner schrieb: > value = xpdr_code/10; > value = value%10; 16bit / 10 = 8bit Kann in die Hose gehen
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.