Forum: Mikrocontroller und Digitale Elektronik sprintf() mit float funktioniert nicht


von Michael L. (nightflyer88)


Lesenswert?

Hallo

Ich wollte ein kleines Programm mit EMblocks für den STM32F4 machen, nun 
kann ich in der sprintf funktion keine float umwandeln ?!

float xy = 65.12345;
char txt[100] = "";
sprintf(txt, "%f", xy);


Was mach ich falsch ? Muss noch irgend eine lib eingebunden werden ?

Mit int funktionierts:

int xy = 65;
char txt[100] = "";
sprintf(txt, "%d", xy);


Ich hoffe jemand hat einen Tip parat ;-)

von Lukas K. (carrotindustries)


Lesenswert?

Michael L. schrieb:
> nun
> kann ich in der sprintf funktion keine float umwandeln ?!

Was passiert denn? Was steht nach dem sprintf() in txt drin? Ich hatte 
mal ein ähnliches Problem: 
Beitrag "[ARM] Nützliches newlib-nano float printf"

von Jim M. (turboj)


Lesenswert?

Newlib braucht Heap (malloc) für "%f" in den printf() funtionen. Wenn 
ich keinen Heap haben will wandle ich Vor- und Nachkommastellen in 
Integer und füttere damit printf() Funktionen.

von Michael L. (nightflyer88)


Lesenswert?

Lukas K. schrieb:
> Was passiert denn? Was steht nach dem sprintf() in txt drin?

nichts, txt bleibt leer

von Michael L. (nightflyer88)


Lesenswert?

Jim M. schrieb:
> Newlib braucht Heap

wo kann ich den Heap stack anpassen ? oder nur wenn ich das projekt 
eröffne ?

von S. R. (svenska)


Lesenswert?

Beherrscht dein sprintf() überhaupt floats? Das ist öfter mal per 
default abgeschaltet, um Flash zu sparen. Guck mal ins Buildsystem. In 
der Newlib brauchst du ein funktionierendes sbrk(), welches den Heap 
implementiert.

von Pandur S. (jetztnicht)


Lesenswert?

Printf ist ein Elefant, man sollte ueber itoa = integer to Ascii 
nachdenken.

von msx (Gast)


Lesenswert?

Oder D. schrieb:
> Printf ist ein Elefant, man sollte ueber itoa = integer to Ascii
> nachdenken.

Ein STM32F4 frißt einen Elefanten locker zum Frühstück. Und danach 
trinkt er am liebsten Doubles.
Mach Dir also keine Gedanken ;-)

von S. R. (svenska)


Lesenswert?

Oder D. schrieb:
> Printf ist ein Elefant, man sollte ueber itoa = integer to Ascii
> nachdenken.

Das ist ganz besonders dann sinnvoll, wenn man mit float 
hantiert.</ironie>

von Karl H. (kbuchegg)


Lesenswert?

S. R. schrieb:
> Oder D. schrieb:
>> Printf ist ein Elefant, man sollte ueber itoa = integer to Ascii
>> nachdenken.
>
> Das ist ganz besonders dann sinnvoll, wenn man mit float
> hantiert.</ironie>


Na ja. Machen kann man das schon.
Aber mit einem STM32 hat man einen Boliden vor sich, bei dem man sich 
über float keine Gedanken mehr machen muss. Da ist der Griff zu 
derartigen Klimmzügen nicht mehr notwendig

von Michael L. (nightflyer88)


Lesenswert?

Noch eine zusätzliche INFO: Ich befasse mich erst seit kurzem mit dem 
STM32, vorher habe ich mit AVR hantiert. Deshalb bitte ich um 
Verständnis, wenn ich nicht weis wo ich welche Einstellung finde...


S. R. schrieb:
> Beherrscht dein sprintf() überhaupt floats?
keine Ahnung, ich habe meine ersten Schritte wie im folgenden Link 
gemacht, und das Projekt auch so eröffnet. Die Beschriebenen libs unter 
Punkt 2, habe ich auch so rein kopiert.
https://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks

> Das ist öfter mal per default abgeschaltet, um Flash zu sparen. Guck mal
> ins Buildsystem.
wo genau ?

> In der Newlib brauchst du ein funktionierendes sbrk(), welches den Heap
> implementiert.
wo finde ich die Newlib ?

von Michael L. (nightflyer88)



Lesenswert?

Also habe mal versucht den Heap Stack anzupassen (Bild), ich hoffe das 
ist richtig so ? jedoch ändert sich mit dem sprintf() immer noch 
nichts..

Wenn ich das richtig sehe habe ich nirgens eine Newlib in meinem Projekt 
Baum ?

Ist es wirklich so eine Zangengeburt, "nur" eine float Zahl per Uart 
auszugeben ? Beim AVR gings wesentlich einfacher ;-)

von Dieter (Gast)


Lesenswert?

Hallo,

probiers mal mit einem "f" hinter deiner float-Zahl, also z.B.:
1
float xy = 65.12345f;

Wenn das "f" fehlt, interpretieren einige Compiler die float-Zahl als 
double. Dann passt natürlich die sprintf-Funktion nicht mehr.

von Karl H. (kbuchegg)


Lesenswert?

Dieter schrieb:
> Hallo,
>
> probiers mal mit einem "f" hinter deiner float-Zahl, also z.B.:
>
>
1
> float xy = 65.12345f;
2
>
>
> Wenn das "f" fehlt, interpretieren einige Compiler die float-Zahl als
> double. Dann passt natürlich die sprintf-Funktion nicht mehr.

Sollte egal sein. Denn auch ein %f in einem sprintf wird als double 
interpretiert. Bei variadischen Argument, wie den Funktionen aus der 
printf Familie werden float sowieso immer als double übergeben (genauso 
wie ein char auch immer als int übergeben wird)
Schaden kanns nicht, aber versprechen würde ich mir davon nichts.

: Bearbeitet durch User
von Michael L. (nightflyer88)


Lesenswert?

Dieter schrieb:
> probiers mal mit einem "f" hinter deiner float-Zahl

nützt auch nichts.

Muss ich den die Newlib noch einbinden oder nicht ?

von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

jetzt funktionierts !!

Die Newlib in den Einstellungen war nicht angewählt.

Besten Dank für eure Tips

von Michael L. (nightflyer88)


Lesenswert?

Ich habe trotzdem noch ein Problem: Die Berechnung mit der float 
variable funktioniert irgendwie nicht.

von Michael L. (nightflyer88)


Lesenswert?

float xy;

xy = 10/3;

sprintf(txt, "%f\r\n", xy);
USART_send(USART1, txt);


sollte eigentlich 3.333 anzeigen, aber die stellen nach dem Komma sind 
0. es wird also nur 3.0000 angezeigt

von Dieter W. (dds5)


Lesenswert?

Dann schreib doch mal xy = 10.0/3.0.

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.