Hallo!
Hab mich gerade durch den Artikel durchgearbeitet und mir ist folgender
kleine "Fehler" aufgefallen:
Unter der Fkt. "my_round" steht folgendes:
"Die Funktion ist auch auf einen String anwendbar, welcher mit my_itoa()
erzeugt wurde (also vorzeichenbehaftete Zahlen). Allerdings muss der
Funktion ein Pointer auf das zweite Byte (char) übergeben werden, da im
ersten das Vorzeichen gespeichert ist. Das geschieht am einfachsten so.
"
1 | my_round(my_string+1, 5);
|
Hierbei wird aber nicht berücksichtigt, daß
1.) sich der Index für die Rundung mit verschiebt.
es müßte folgendermaßen heißen:
1 | my_round(my_string+1, 5-1);
|
2.) in der for-Schleife der Index für vorzeichenbehaftete Zahlen bis 10
und nicht nur bis 9 laufen muß, da für Vorzeichenbehaftete Zahlen ein
12Byte großes Feld benötigt wird.
Ich hab das volgendermaßen gelöst:
1 | void round_32bit(char* string , uint8_t index_digit)
|
2 | {
|
3 |
|
4 | uint8_t i , index_end;
|
5 |
|
6 |
|
7 | if( (string[0] == '-') || (string[0] == ' ') )
|
8 | { // vorzeichenbehaftete Zahl? (12Byte String)
|
9 | string+1; // 1. Byte = sign -> Pointer auf 2tes Byte stellen
|
10 | index_digit-1; // Index würde sich mitverschieben, daher korrektur
|
11 | index_end = 10; // index_end für 12 Byte string
|
12 | }
|
13 | else
|
14 | index_end = 9; // index_end für 11 Byte String
|
15 |
|
16 |
|
17 | if (string[index_digit] >= '5') // muß aufgerundet werden ?
|
18 | {
|
19 |
|
20 | for (i= index_digit-1 ; i>=0 ; i--) // einzelne Ziffern ansprechen
|
21 | {
|
22 |
|
23 | string[i] += 1; // Ziffer aufrunden
|
24 | if (string[i] <= '9') // wenn kein Übertrag Schleife verlassen
|
25 | break;
|
26 |
|
27 | else
|
28 | string[i] = '0'; // Übertrag + Überlauf
|
29 | }
|
30 |
|
31 | }
|
32 |
|
33 | for (i=index_digit ; i<=index_end ; i++) // gerundete Stellen auf Null setzen
|
34 | string[i] = '0';
|
35 |
|
36 | }
|
Gruß Rick