mikrocontroller.net

Forum: Compiler & IDEs problem mit string zu float konvertierung und umgekehrt


Autor: tobelix (Gast)
Datum:

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

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    while(i< size && c!='\r');


das ist schon mal ne ganz komische Schleife, entweder endlos oder 
sinnlos

Autor: FBI (Gast)
Datum:

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

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.