mikrocontroller.net

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


Autor: Christof Kauba (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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():
void my_itoa(int16_t zahl, char* string) {
  uint8_t i;
 
  string[6]='\0';                     // String Terminator
  if( zahl < 0 ) {                  // ist die Zahl negativ?
    string[0] = '-';              
    zahl = -zahl;
  }
  else string[0] = '0';             // Zahl ist positiv
 
  for(i=5; i>=1; i--) {
    string[i]=(zahl % 10) +'0';     // Modulo rechnen, dann den ASCII-Code von '0' addieren
    zahl /= 10;
  }
}

und hier die Funktion formatNumber()
void formatNumber(char* inputString, char* outputString, uint8_t komma, uint8_t frac) {

  uint8_t i = 0;        // Zähler
  uint8_t j = 0;    // Zähler 2
  uint8_t flag=0;       // Merker für führende Nullen

  // Vorkommastellen ohne führende Nullen ausgeben
  for(; i<komma; i++)
  {
    if (flag==1 || inputString[i]!='0')
    {
      if (flag==0 && inputString[0]=='-')
      {
        outputString[0] = '-';     // negatives Vorzeichen ausgeben
        j++;
      }
    outputString[j] = inputString[i];
    j++;
    flag = 1;
    }
  }

  outputString[j] = ',';                // Komma ausgeben

  // Nachkommastellen ausgeben
  for(; i<(komma+frac); i++)
  {
    j++;
    outputString[j] = inputString[i];
  }

  j++;
  outputString[j] = '\0';
}


Mein Problem ist nun folgendes:
Wenn ich die Funktionen in dieser Reihenfolge aufrufe, z.B.:
my_itoa(volt, UARTTemp);
formatNumber(UARTTemp, voltT, 4, 2);

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

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!

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Christof Kauba (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.