Forum: Compiler & IDEs Float wird nicht angezeigt mit sprintf()


von Stefan (Gast)


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?

von Stefan H. (stefanhennig)


Lesenswert?

Stefan schrieb:
> uint8_t buffer[3];

Dein Buffer ist zu klein, sprintf überschreibt Deinen Speicher, daher 
verhält sich das Programm unvorhersagbar. Dass irgendeine Version 
funktioniert ist der reine Zufall.

sprintf ist niemals eine gute Idee. Verwende snprintf (dort kannst Du 
nämlich die Buffergröße vorgeben).

Grüße,
 Stefan

von Stefan (Gast)


Lesenswert?

Also ich hab nun buffer vergrößert und snprintf() verwendet. Kommt aber 
immernoch "?"

uint8_t length = 20;
uint8_t buffer[length];
snprintf(buffer, length+1, "%f", ((float)s/time)*100);

von Karl H. (kbuchegg)


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.

von Stefan H. (stefanhennig)


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

von Stefan (Gast)


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.

von Stefan (Gast)


Lesenswert?

-Wl,-u,vfprintf

ist das ein WL oder WI (i)

von Stefan (Gast)


Lesenswert?

Also muss WL sein, aber leider funktioniert sprintf() nicht

von Karl H. (kbuchegg)


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

von Stefan (Gast)


Lesenswert?

:) tut mir Leid, so Primitiv das ich schon lachen muss ... wieso ist mir 
das nicht eingefallen. Klappt supper

von tset (Gast)


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.
Ist s(n)printf mit Integern so aufwendig?

von Karl H. (kbuchegg)


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.

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.