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
while(i< size && c!='\r'); das ist schon mal ne ganz komische Schleife, entweder endlos oder sinnlos
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.