Forum: Compiler & IDEs Problem mit utoa und selbstgebastelter Funktion my_itoa


von Christof Kauba (Gast)


Lesenswert?

Hallo, ich habe ein seltsames Problem beim Umwandeln von Zahlen in 
Strings.
Da ich Festkommarithmetik verwende, benötige ich zum Umwandeln von 
meinen Festkommazahlen die Funktion my_itoa() und zusätzlich noch 
formatNumber(). Diese habe ich mal irgenwo hier oder im Roboternetz 
gefunden.

Hier die Funktion my_itoa():
1
void my_itoa(int16_t zahl, char* string) {
2
  uint8_t i;
3
 
4
  string[6]='\0';                     // String Terminator
5
  if( zahl < 0 ) {                  // ist die Zahl negativ?
6
    string[0] = '-';              
7
    zahl = -zahl;
8
  }
9
  else string[0] = '0';             // Zahl ist positiv
10
 
11
  for(i=5; i>=1; i--) {
12
    string[i]=(zahl % 10) +'0';     // Modulo rechnen, dann den ASCII-Code von '0' addieren
13
    zahl /= 10;
14
  }
15
}

und hier die Funktion formatNumber()
1
void formatNumber(char* inputString, char* outputString, uint8_t komma, uint8_t frac) {
2
3
  uint8_t i = 0;        // Zähler
4
  uint8_t j = 0;    // Zähler 2
5
  uint8_t flag=0;       // Merker für führende Nullen
6
7
  // Vorkommastellen ohne führende Nullen ausgeben
8
  for(; i<komma; i++)
9
  {
10
    if (flag==1 || inputString[i]!='0')
11
    {
12
      if (flag==0 && inputString[0]=='-')
13
      {
14
        outputString[0] = '-';     // negatives Vorzeichen ausgeben
15
        j++;
16
      }
17
    outputString[j] = inputString[i];
18
    j++;
19
    flag = 1;
20
    }
21
  }
22
23
  outputString[j] = ',';                // Komma ausgeben
24
25
  // Nachkommastellen ausgeben
26
  for(; i<(komma+frac); i++)
27
  {
28
    j++;
29
    outputString[j] = inputString[i];
30
  }
31
32
  j++;
33
  outputString[j] = '\0';
34
}


Mein Problem ist nun folgendes:
Wenn ich die Funktionen in dieser Reihenfolge aufrufe, z.B.:
1
my_itoa(volt, UARTTemp);
2
formatNumber(UARTTemp, voltT, 4, 2);
3
4
my_itoa(baro, UARTTemp);
5
formatNumber(UARTTemp, baroT, 5, 1);
6
7
utoa(hell, hellT, 10);
dann habe ich bei dem String voltT keine Probleme. Dieser ist dann z.B. 
12,45, aber beim String baroT kommt dann soetwas wie 1017,1225 heraus, 
wobei das "225" der Wert von hell ist.

Ich kann mir leider weder erklären woran das liegt, noch wie ich dieses 
Problem beheben soll.


Aber ich möchte sowieso andere Funktionen für die Umwandlung von 
Gleitkomma in String verwenden, bzw. nur eine Funktion, aber ich bin mir 
immer zu faul, mir eine passende Funktion zu schreiben.
Die von mir verwendeten Funktionen müssen ja führende Nullen haben, da 
ansonsten das Ergebnis nicht stimmt, sonst könnte ich statt my_itoa() ja 
auch itoa() verwenden.


Wäre für jegliche Hilfe dankbar!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Sieht nach einem Pufferüberlauf aus.

Angenommen die Strings sind so anlegt:

char UARTTemp[IRGENDWAS1];
char voltT[IRGENDWAS2];
char baroT[IRGENDWAS3];
char hellT[IRGENDWAS4];

my_itoa(volt, UARTTemp);
formatNumber(UARTTemp, voltT, 4, 2);

my_itoa(baro, UARTTemp);
formatNumber(UARTTemp, baroT, 5, 1);

utoa(hell, hellT, 10);

Ist in allen genug Platz drin? Reicht z.B. der Platz in baroT für die 7 
Zeichen (1017,1 + Nullbyte)? Nicht dass das Nullbyte bereits in hellT 
landet...

von Christof Kauba (Gast)


Lesenswert?

Tatsächlich, ich hatte übersehen, dass ja bei baroT 6 Zeichen + 
Stringterminator gespeichert werden, und nicht wie bei den anderen Werte 
nur 5 + Stringterminator.

Hätte mir nicht gedacht, dass es so etwas simples ist.

Danke für die schnelle Hilfe!

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
Noch kein Account? Hier anmelden.