Forum: Compiler & IDEs sprintf float


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Dirk H. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe folgendes Problem :


char Buffer[50];
double wert;

wert = 10000.0;

...

sprintf( Buffer, "%2.2f",wert/1000.0);

Ich erhalte als Ergebnis "10ñ00".
Was mache ich falsch

von Kai S. (zigzeg)


Bewertung
0 lesenswert
nicht lesenswert
Dirk H. schrieb:
> Ich erhalte als Ergebnis "10ñ00".

Ich denke der Fehler steckt irgendwo zwischen dem sprintf und der nicht 
gezeigten Art und Weise wie daraus das Ergebnis wird.

In den gezeigten Zeilen kann ich jedenfalls keinen Fehler entdecken.

ZigZeg

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Dirk H. schrieb:
> Was mache ich falsch

Du schreibst uns zu wenig über deine Umgebung …

von >_ pr0 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Dirk,

wo wird dir dieses Ergebnis angezeigt?
Auf einem LCD? In einer Konsole?
Hab keine Schäu und hau raus mit den Informationen :)

Liebe Grüße

von Vincent H. (vinci)


Bewertung
0 lesenswert
nicht lesenswert
-u_printf_float

von Dirk H. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich verwende µVision 5.23 ( MDK Cortex M).

Der String wird zeichenweise auf einem Grafik-Display ausgegeben.

Statt einem "." oder auch gerne einem "," erhalte ich halt das 
Sonderzeichen "ñ" (Buffer[2] = "164")

Mit allen anderen Variablen-Typen funktioniert sprint, nur mit float 
nicht ?!?

von Dirk H. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich selber vermute etwas in Richtung Stack-Overflow. Nur warum ?
Ich werde das Problem erst einmal umgehen (Aufspalten in Integer, ...), 
aber ganz ehrlich, ich wuerde schon gerne wissen, wo mein Fehler liegt!
Danke schon mal fuer die schnellen Antworten !

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Hast du denn den Sourcecode der Bibliothek?  Dann könntest du ja mal
versuchen, das nachzuvollziehen.  Weiß nicht, wie das bei Keil ist,
bei IAR bekommt man den wohl mitgeliefert, und bei den
Opensource-Toolchains hat man ihn ja sowieso.

Ist denn nur der Punkt betroffen, d. h. wenn sich die Zahl ändert,
stimmen die Ziffernwerte trotzdem noch?

von Dirk H. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jörg W. schrieb:
> Hast du denn den Sourcecode der Bibliothek?  Dann könntest du ja
> mal
> versuchen, das nachzuvollziehen.  Weiß nicht, wie das bei Keil ist,
> bei IAR bekommt man den wohl mitgeliefert, und bei den
> Opensource-Toolchains hat man ihn ja sowieso.
>
> Ist denn nur der Punkt betroffen, d. h. wenn sich die Zahl ändert,
> stimmen die Ziffernwerte trotzdem noch?

Die Ziffern werden richtig in Zeichen umgewandelt, egal welche Ziffer, 
egal wie viele Nachkommastellen , nur das Komma nicht.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Was kommt eigentlich raus, wenn du ein e-Format benutzt (%e)?

von Rolf Magnus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Kann man das Dezimaltrennzeichen ggf. einstellen (locale)? Vielleicht 
ist es nicht richtig vorbesetzt.

von Dirk H. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jörg W. schrieb:
> Was kommt eigentlich raus, wenn du ein e-Format benutzt (%e)?

Das wird richtig angezeigt, inkl. "." und "E".

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
In der Tat seltsam.

Mach doch einen Support-Fall bei Keil auf dafür.

von Dirk H. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jörg W. schrieb:
> In der Tat seltsam.
>
> Mach doch einen Support-Fall bei Keil auf dafür.

Das werde ich wohl machen, werde das Ergebnis hier veroeffentlichen.
Ich bin das Problem erst einmal mit einer eigenen Funktion umgangen.
Aufspalten in zwei Integer Variablen und dann sprintf(.%d,%d ..).

von Vincent H. (vinci)


Bewertung
0 lesenswert
nicht lesenswert
Ich tippe eher auf sowas wie "float support" in der Toolchain via flag 
deaktivierbar... In der newlib gibts sowas zum Beispiel via 
-u_printf_float.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Vincent H. schrieb:
> Ich tippe eher auf sowas wie "float support" in der Toolchain via flag
> deaktivierbar.

Sieht in der Keil-Doku eher nicht danach aus.

Was völlig gegen solch eine Theorie spricht ist, dass ja "%e" normal
funktioniert.

: Bearbeitet durch Moderator
von mostefan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
meines wissens gibt die zahl vor dem Punkt die Breite des gesamten 
Strings an. darf also nicht kleiner sein als die zweite Zahl.

i.e.

%5.2f

gibt dir maximal 99.99

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
mostefan schrieb:
> darf also nicht kleiner sein als die zweite Zahl.

Dein Wissen ist nur im ersten Teil des Satzes richtig; die zitierte
Schlussfolgerung hingegen ist falsch.  Das war bei BASIC und FORTRAN
(und wohl auch COBOL) so, bei C ist definiert, dass der String
automatisch so breit wird wie nötig, auch wenn die angegebene Breite
nicht ausreichen sollte.

Die Ausgabe eines Dezimalpunktes als irgendein wahlloses Zeichen
würde es allemal nicht rechtfertigen.

: Bearbeitet durch Moderator

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]
  • [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.