Hallo, um eine vorzeichenbehaftete 7.8 Festkommazahl auf einem avr in einen String umzuwandeln, habe ich folgende Funktion gebastelt. Ich würde mich über konstruktive Kritik an der Funktion freuen. Gibt es noch eine einfachere Möglichkeit, die Umwandlung vorzunehmen? Viele Grüße Michael
1 | #include <avr/io.h> |
2 | #include <string.h> |
3 | #include <stdlib.h> |
4 | |
5 | void Q7p8toString(char * str, uint16_t number, uint8_t nachkommastellen) { |
6 | |
7 | str[0] = 0; |
8 | |
9 | if (!(number & 0x8000)) { |
10 | // positiv
|
11 | } else { |
12 | // negativ
|
13 | number = (~number) + 1; |
14 | |
15 | // Minus einfügen
|
16 | strcat(str, "-"); |
17 | }
|
18 | |
19 | // Vorokmmaanteil
|
20 | volatile uint16_t vorkomma = number >> 8; |
21 | char hilf [4]; |
22 | itoa(vorkomma,hilf,10); |
23 | strcat(str,hilf); |
24 | |
25 | // Vorkommaanteil löschen
|
26 | number = number & 0x00FF; |
27 | |
28 | // Komma
|
29 | uint8_t strpos = 0; |
30 | strpos = strlen(str); |
31 | str[strpos] = ','; |
32 | strpos++; |
33 | str[strpos] = 0; |
34 | |
35 | |
36 | // Nachkommaanteil
|
37 | for (int i=0; i<nachkommastellen; i++) { |
38 | number = number * 10; |
39 | uint8_t stelle = number >> 8; |
40 | |
41 | // Stelle anhängen
|
42 | str[strpos] = 0x30+stelle; |
43 | strpos++; |
44 | str[strpos] = 0; |
45 | |
46 | number = number &0x00FF; |
47 | }
|
48 | }
|