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


von tobelix (Gast)


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

von Walter (Gast)


Lesenswert?

    while(i< size && c!='\r');


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

von FBI (Gast)


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

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.