problem mit string zu float konvertierung und umgekehrt

Gast #558300
Lesenswert?
• ▲
▼
Hallo,

ich hab mal wieder ein prob und wäre super froh, wenn mir jemand helfen 
könnte. ich lese zahlen als string über uart ein und konvertiere, die 
dann in ein float, möchte diesen float dann aber als kontrolle nochmal 
als string über uart ausgeben. bei dem ersten so eingegebenen wert 
funktioniert das auch super, nur beim zweiten gibt mir die 
kontrollausgabe nur die stellen vor dem komma aus (die rundung scheint 
aber noch zu funktionieren). habt ihr eine ahnung woran das liegt?

String-Erstellung:

void input_string(char *s, unsigned int size)
{
    int i=0;
    char c;
    do
    {
      c=uart_getc();
      if (c!='\r')
       {
           s[i]=c;
      uart_putc(c);
          i++;
       }
    }
    while(i< size && c!='\r');
    s[i]='\0';
}

Eingabe-Funktion:

void input_Parameters(unsigned int buffersize)
{
  unsigned char c = 0;
  char buffer[buffersize];
  unsigned int dec = 5;

  clr_screen();
   uart_puts_p (PSTR("Koeffizient Y(k-1) = "));

  input_string(buffer, buffersize);
  coeff_y_alt1 = atof(buffer);
  uart_puts_p (PSTR("  >>  Kontrollausgabe: "));
  uart_puts(dtostrf(coeff_y_alt1, buffersize, dec, buffer));

  uart_puts_p (PSTR("\r\n"));
  uart_puts_p (PSTR("Koeffizient Y(k-2) = "));

  input_string(buffer, buffersize);
  coeff_y_alt2 = atof(buffer);
  uart_puts_p (PSTR("  >>  Kontrollausgabe: "));
  uart_puts(dtostrf(coeff_y_alt2, buffersize, dec, buffer));
}

Wäre super, wenn jemand ne Idee hätte.

Schonmal Danke!

Gruß

tobi
Gast #558749
Lesenswert?
• ▲
▼
@Walter:
Du solltest Dir die Zeilen davor auch anschauen. Das ist ein 
"do{...}while(...);".

@Tobi:
Du hast ein riesen Problem mit der Größe von "buffer" bzw. dem Wert von 
"buffersize" und der Verwendung dieses Wertes!
Was passiert am Ende von "input_string", wenn Deine Schleife nicht wegen 
"c=='\r'" abbricht sondern wegen "i>=size"? Richtig, Stack hinüber :(
Desweiteren schau Dir die Doku zu "dtostrf" an!!! Der zweite Parameter 
gibt die MINIMALE Länge des ausgegebenen Strings an! Dabei wird das 
abschließende '\0' NICHT mitgerechnet. D.h. Du zerschießt Dir spätestens 
hier auf jeden Fall Deinen Stack :(
Und da das wirklich nur die MINIMALE Länge ist, kann der String auch 
noch viel länger werden. Beispielsweise ergibt "dtostrf(12345.6789, 1, 
2, buffer);" einen String mit 8 Zeichen ("12345.67"), braucht also 
mindestens 9 Byte Speicherplatz.
Es ist eigentlich schon ein ziemliches Wunder, daß Du da überhaupt noch 
halbwegs sinvolle Ausgaben rausbekommst bzw. daß Dein Programm nicht 
komplett crashed. Wahrscheinlich hat der GCC die Variable "dec" nicht in 
ein Register optimiert (oder Du hast die Optimierungen abgeschaltet), so 
daß diese direkt nach "buffer" auf dem Stack liegt und beim ersten 
Aufruf von "dtostrf" einfach mit einer 0 überschrieben wird.

CU

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.