Hallo zusammen!
Für meine Ausgabe über UART hab ich mir eine funktion programmiert, die
zwei Teile Text und eine float-Zahl übergeben bekommt. Zum testen zieht
eine Schleife einfach immer 0.1 von n=3.141592 ab. Allerdings
funktioniert die Ausgabe nur manchmal richtig:
Ausgabe:
1
float3.14159
2
float3.04159
3
float2.28623
4
float2.18623
5
float2.08623
6
float2.0/-))
7
float2.//-))
8
float2../-))
9
float2.-/-))
10
float2.24159
11
float2.14159
12
float2.04159
13
float1.28623
14
float1.18623
15
float1.08623
16
float1.0/-))
17
float1.//-))
18
float1../-))
19
float1.-/-))
20
float1.24159
Fast die gleiche Funktion hab ich mir schon mal gebaut, um einfache Int
mit Text anzuzeigen, da verwende ich itoa statt ftoa. Die läuft auch
einwandfrei. Aber was stimmt an dem Code hier nicht?? Braucht ftoa
irgendwas besonderes um den String richtig zu kreieren?
Danke für die schnelle Antwort. Geht mit der Variante leider immer noch
nicht. Selbes Ergebnis.
Warum ollte das so sein? Ein String ist doch auch nur ein Array aus
Chars, oder?
Edit: ftoa war in einer lib drin, die ich eingebunden habe, genau wie
das itoa, also irgendeine davon:
#include <stdint.h>
#include <stddef.h>
#include <avr/io.h>
#include <errno.h> //für Umwandlung str to int
#include <limits.h> //Maxima/Minima der Int,...
#include <string.h>
#include <ctype.h> //zum Testen auf alphanumerische Zeichen und Co
#include <math.h>
Michael D. schrieb:> Warum isollte das so sein? Ein String ist doch auch nur ein Array aus> Chars, oder?
Weil der Text (die Zeichen) woanders im Speicher liegt.
Stringliterale sind const char *
Dirk B. schrieb:> Stringliterale sind const char *
Stimmt, die sind ja vorinitialisiert.
Das Problem liegt wohl wirklich in dieser ftoa, woher auch immer mein
gcc sie kennt (arbeite übrigens nicht mit Atmel studio). Gut sichtbar an
diesem Versuch von Wendelsberg:
float #1.08623#
float #1.0/-))#
float #1.//-))#
War mir aber auch vor dem Versuch schon klar, weil Text hat immer ohne
Probleme funktioniert.
Gibt es jemand der eine gute ftoa geschreiben hat? Hab hier nur eine die
irgendwie komsich ist
https://ucexperiment.wordpress.com/2016/02/23/lean-and-mean-float-to-string-conversion-ftoa/
GEIL, es geht! Danke an alle!
char numsend[8];
dtostrf (number, 3, 5, numsend);
macht die Umwandlung in einen String richtig und die kann ich dann wie
oben aneinanderhängen. Wo dieses falsche ftoa hergekommen ist das er
trotzdem geklannt hat? Keine Ahnung...
Michael D. schrieb:> http://www.geeksforgeeks.org/convert-floating-point-number-string/
Diese Funktion versagt, wenn die Nachkommastellen nicht als int
darstellbar sind.
Beispiel:
In der dritten Ausgabezeile sollte 2.94159 ausgegeben werden. Die
Nachkommastellen sind 94159. Die Zahl 94159 ist aber nicht als
16-Bit-Integer darstellbar. Die Konvertierung scheint das 17. Bit
einfach abzuschneiden, so dass 94159 - 0x10000 = 28623 übrigbleibt.
Die ausgabe lautet deswegen 2.28623.
In der sechsten Ausgabezeile werden die zu int konvertierten
Nachkommastellen sogar negativ, was zu den seltsamen Symbolen führt.
Wenn du maximal vier Nachkommastellen ausgibst, sollte die Funktion
immer funktionieren.
Stefan: snprintf hat mir aus irgendeinem Grund bei %s%f%s statt des
floats in der Mitte nur ein Fragezeichen geliefert, egal was als Float
übergeben wurde.
Yalu: Danke für die Erklärung der komischen Zeichen! Sowas sieht man
nicht auf Anhieb. Und es vervollständigt den Thread :)
Michael D. schrieb:> snprintf hat mir aus irgendeinem Grund bei %s%f%s statt des> floats in der Mitte nur ein Fragezeichen geliefert, egal was als Float> übergeben wurde.
Du musst die Floating-Point Version von snprintf nehmen.
Die ist in einer anderen/zusätlichen Library.
Michael D. schrieb:> Bin grad überfragt, drum frag ich euch ;)
Tja.
Lade dir die Lernbetty runter und benutze conv.c von dort, das läuft
auch auf einem AVR und die dortige Float-Konvertierung funktioniert.
W.S.