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 ;-)
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"
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.
Lukas K. schrieb: > Was passiert denn? Was steht nach dem sprintf() in txt drin? nichts, txt bleibt leer
Jim M. schrieb: > Newlib braucht Heap wo kann ich den Heap stack anpassen ? oder nur wenn ich das projekt eröffne ?
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.
Printf ist ein Elefant, man sollte ueber itoa = integer to Ascii nachdenken.
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 ;-)
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>
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
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 ?
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 ;-)
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.
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
Dieter schrieb: > probiers mal mit einem "f" hinter deiner float-Zahl nützt auch nichts. Muss ich den die Newlib noch einbinden oder nicht ?
jetzt funktionierts !! Die Newlib in den Einstellungen war nicht angewählt. Besten Dank für eure Tips
Ich habe trotzdem noch ein Problem: Die Berechnung mit der float variable funktioniert irgendwie nicht.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.