www.mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
uint8_t time = 500;
uint8_t s = 300;
uint8_t buffer[3];
dtostrf((float)s/time)*100, 3, 0, buffer);
lcd_string(buffer);

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

Woran liegt das?

Autor: Stefan Hennig (stefanhennig)
Datum:

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

Autor: Stefan (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geh deine Einstellungen noch einmal durch:
http://www.mikrocontroller.net/articles/FAQ#Aktivi...



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.

Autor: Stefan Hennig (stefanhennig)
Datum:

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

Autor: Stefan (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-Wl,-u,vfprintf

ist das ein WL oder WI (i)

Autor: Stefan (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Stefan (Gast)
Datum:

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

Autor: tset (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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.