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:
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
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);
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.
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
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.
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
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?
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.