Float wird nicht angezeigt mit sprintf()

Gast #1911294
Lesenswert?

Hallo,

habe ein Problem mit Float Darstellung auf einem LCD-Display. Habe die 
Bibliotheken zum Objekt gelinkt (libprintf.flt.a und libm.a). Und auch 
-WI,-u,vfprintf eingefügt.

Funktioniert:
1
uint8_t time = 500;
2
uint8_t s = 300;
3
uint8_t buffer[3];
4
dtostrf((float)s/time)*100, 3, 0, buffer);
5
lcd_string(buffer);

Kommt als Ausgabe "?"
1
uint8_t time = 500;
2
uint8_t s = 300;
3
uint8_t buffer[3];
4
sprintf(buffer, "%f", ((float)s/time)*100);
5
lcd_string(buffer);

Woran liegt das?
#1911316
Lesenswert?

Geh deine Einstellungen noch einmal durch:
http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio



1
snprintf(buffer, length+1, "%f", ((float)s/time)*100);

was soll das +1 an dieser Stelle? Lügst du deinen 
Compiler/Runtime-Library gewohnheitsmässig an? Dann darfst du dich nicht 
über seltsame Fehler wundern.
#1911320
Lesenswert?

Stefan schrieb:
> snprintf(buffer, length+1, "%f", ((float)s/time)*100);

Ähm, was hats mit dem length+1 auf sich? Ich meine zwar, dass 20 Zeichen 
möglicherweise reichen könnten, aber Dein Buffer ist nun einmal 20 und 
nicht 21 Zeichen lang.

Hast Du mal mit einem Debugger oder Emulator geschaut, was im Buffer 
steht?

Ansonsten kann ich Dir nicht großartig weiterhelfen, denn ich habe in 
den letzten 10 Jahren Embeddedprogrammierung bisher noch keine 
Fließkommazahlen verwendet.
Natürlich solltest Du dieses Problem lösen, aber denke mal unabhängig 
davon nach, ob Du nicht auch mit einer Festkommadarstellung leben 
kannst.

Ähm, ich nehme jetzt mal an, dass es sich um ein Embedded-Projekt 
handelt. Du schreibst ja sehr wenig darüber, was Du wo und wie wofür 
programmierst.

Grüße,
  Stefan
Gast #1911326
Lesenswert?

also bis auf formatierte Ausgabe d.h. mit vorstehende 0 an eine Zahl 
(08) und der Berechnung von Prozent verwende ich sprintf sonst nie.

würde gern darauf verzichten, da es schon sehr viel Speicher frisst! 
Leider weiß ich nicht, wie ich die Berechnung des Prozent anders lösen 
kann.
#1911335
Lesenswert?

Stefan schrieb:
> also bis auf formatierte Ausgabe d.h. mit vorstehende 0 an eine Zahl
> (08) und der Berechnung von Prozent verwende ich sprintf sonst nie.

vorher multiplizieren und erst dann dividieren
sprintf( buffer, "%d", s * 100 / time );
aufpassen muss man nur, dass man den Wertebereich für int (oder was du 
dann eben hast) nicht nach oben überläuft.

Wenn du 1 "Nachkommastelle" haben willst

sprintf( buffer, "%d.%01d", ( s * 1000 / time ) / 10, ( s * 1000 / time 
) % 10 );

(kürzen darfst du selber :-)

Anstelle von sprintf dann eben deine Lieblings-Ausgabefunktion
#1911349
Lesenswert?

tset schrieb:
> Stefan schrieb:
>> also bis auf formatierte Ausgabe d.h. mit vorstehende 0 an eine Zahl
>> (08) und der Berechnung von Prozent verwende ich sprintf sonst nie.
> Ist s(n)printf mit Integern so aufwendig?

Kommt immer drauf an - Was ist schon aufwändig.

Wenn ich den Platz im Flash habe, dann mach ich auch nicht lange rum.
Ansonsten bringt halt sprintf einiges an Funktionalität mit.

Support für unterschiedliche Datentypen
Ausrichtung in Ausgabefeldern links/rechts
Führende 0-en oder führende Leerzeichen
Wahlweise als Hexzahl formatiert
Einbettung der formatierten Argumente in Text rundherum
etc.

Benutzt man diese nicht, so hat man sie umsonst im Flash und sie braucht 
nur Platz. Kann man davon sinnvoll Gebrauch machen, dann ist es eine 
Abwägungssache ob man den Moloch printf (und Konsorten) mitnimmt oder 
nicht oder ob man sich was eigenes schreibt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren