Hallo, ich bin da auf eine Seltsamkeit in meinem Programmablauf gestossen. Ich versuche mich gerade in gcc mit WinAvr auf einem Atmega32. Ich lese aus einem Feld Zahlen aus, bis ein 'f' gefunden wird. Der Grund: ich erhalte über RS232 eine Befehlsequenz, z.B. 'f123*'. Bei dem '*' lese ich die vorher im Feld abgelegten Zeichen, bis eben zum 'f'. Um daraus eine Zahl zu generieren, multipliziere ich die erste (hier also '3') mit 10^0, die 2. mit 10^1, die 3. mit 10^2 usw. Bei jedem Schleifendurchgang wird das Ergebnis dem Wert aus dem vorherigen Durchgang addiert. So erhält man 3 + 20 + 100 = 123. Das mache ich mit der Funktion "double pow(double x, double y) aus der avr/math.h. Theoretisch! Nun folgendes: Bei einer Ziffer (10^0) funktioniert es problemlos. Bei 2 Ziffern "klaut" der Mikrocontroller mir etwas. Wenn ich z.B. eine '12' auslese, erhalte ich nach der Rechnung eine '11', bei einer 111 nur eine '109', bei 1000 sogar nur '997'. Also wird pro Schleifendurchgang immer eine 1 abgezogen, wie der Fiskus im echten Leben! Natürlich kann man dieses Problem durch "Schummeln" lösen, aber warum passiert das? Kann mir jemand sagen, woran das liegt oder ob ich eine wichtige "Selbstverstädnlichkeit" nicht beachtet habe? Danke für Eure Zeit!
Also für den umständlichsten und langsamsten Code würdest Du ein Anwärter auf den ersten Preis sein. Es ist immer sehr unglücklich, Ganzzahlen zwischendurch in float und wieder zurück zu verwandeln. Schau Dir mal die Funktion atoi() an, die kanns viel besser. Peter
Hallo Peter, vielen Dank für den atoi()-Hinweis. Das klappt sehr gut! Ich habe die Geschichte umgeschrieben und verzichte auf meine "Preisverdächtige"-Routine. Trotzdem beschäftigt mich immer noch die Frage: Warum fehlte immer eine 1?
Die von Peter erwähnte Umwandlung von float zu int. C definiert da striktes "abrunden", womit aus 9.9999 nicht 10 wird sondern 9.
@A.K. Danke! Wenn man mit der Nase hineingestoßen wird, ist es ja nur zu offensichtlich. Das sind aber diese "wichtigen Selbstverständlichkeiten", Kenntnisse, die ich immer wieder vergesse zu beachten bzw. noch einmal zu überdenken.
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.