Forum: Compiler & IDEs float to ascii


von my_ftoa (Gast)


Lesenswert?

Hallo C-Gemeinde,

Mein Hilferuf gehört nicht ganz in dieses Forum. Ich habe ein Problem
mit meinem C-Programm, geschrieben mit dem ICC-AVR-Compiler.
Da hier aber die fähigsten C-Programmieren für AVR zu Hause sind,
versuche ich hier mein Glück.

Ich brauche eine Funktion die float nach ascii wandelt. Die interne
ftoa-Funktion vom ICC-AVR ist für mich nicht brauchbar. Wenn ich mehr
Ahnung von 'C' hätte würde ich mir selber eine schreiben.

Die Funktion soll so aussehen:

my_ftoa( float_variable, ascii_variablevariable, stellen_hinter_komma)

float_variable: hier liegt mein float
ascii_variable: hier soll der ascii-Wert abgelegt werden
stellen_hinter_dem_komma: hier wird ein Wert von 0 bis 6 angegeben.
Der ascii_Wert muß mit 0x00 abgeschlossen werden.

Meine Frage: Wer verfügt über eine solche Funktion, bzw. wer kann mir
eine solche Fuktion schreiben?

Da das Projekt kommerziell genutzt werden soll bin ich natürlich bereit
den Author dieser Funktion finanziell zu entlohnen.


Vielen Dank   my_ftoa

von Fritz Ganter (Gast)


Lesenswert?

Hast du die funktion sprintf() zur Verfügung? Mit der ist es kein
Problem: sprintf(buffer,"%6.3f",f) schreibt z.B. das Format 12.345.
Mit der avr-libc ist das z.B. möglich.

von my_ftoa (Gast)


Lesenswert?

Hallo Fritz,

meine jetzige Variante läuft mit printf. Dieses printf hat jedoch einen
Schönheitsfehler: Es rundet die Nachkommastellen ab. Z.B, der
float-Wert 12,459789 wird, bei 3-stelliger Genauigkeit, nicht mit
12,459 ausgegeben, sondern mit 12,46.
Ich weiß, das z.B.die Compiler CodeVision und Keil-C166 soetwas nicht
machen.

Die Ausgabe auf den Display macht ein nervöses Bild wenn sich die
Stellenzahl ändert.


Schönen Gruß   my_ftoa

von OldBug (Gast)


Lesenswert?

Hi!

Schon mal mit vier (%f.4 im formatstring) Probiert?

Gruß,
Patrick...

von my_ftoa (Gast)


Lesenswert?

Old Bug:

Dieser Effekt tritt bei allen Genauigkeitswerten, also von 0 bis 6,
auf. Irgendwann wird immer gerundet und abgeschnitten.


Gruß   my_float

von Peter D. (peda)


Lesenswert?

Ich benutze das hier:

http://www.mikrocontroller.net/forum/read-4-46127.html


Die Stellenzahl kannst Du natürlich auch als Variable mit übergeben.


Peter

von Andreas Ortner (Gast)


Lesenswert?

Ich benutze ebenfalls ICC Compiler in der 45 Tage Testversion

ich habe ein Problem bei der Formatierung:

int printf(char *fmt, ..)

%[flags]*[width][.precision][l]<conversion character>

%d - prints the next argument as a decimal integer
%f - prints the next argument as a floating point number in decimal
<aaa>.<bbbb> format

Hat jemand Beispiele der verschiedenen printf oder sprintf
Formatierung?
Bei mir funktioniert nur sprintf(string, "%d",value);
Bei %f gibt die Funktion einen String aus "Integer..."

Ich denke evtl. den AVRGCC auszuprobieren, aber der ist nicht so
komfortabel.

Danke

von Jörg Wunsch (Gast)


Lesenswert?

Hmm, RTFM würde ich vermuten.  Viele Microcontroller-Compiler
(AVR-GCC/avr-libc ebenfalls) implementieren standardmäßig keine
Gleitkomma-Darstellung in der printf-Familie, weil diese den Code
unmäßig aufbläht.  Da printf erst zur Laufzeit feststellt, was
wirklich gebraucht wird, müßten alle Applikationen diesen Ballast
mitschleppen.

Daher ist Gleitkommadarstellung sehr oft eine wählbare Option.
Möglicherweise hast Du diese einfach nicht ausgewählt.

Ansonsten hilft Dir jedes gute C-Lehrbuch bzw. jeder C-Compiler für
Standardcomputer, den Koloß von printf besser zu verstehen.  Das ist
nicht in drei Minuten aufgeschrieben.

von Fritz Ganter (Gast)


Lesenswert?

bei printf("%f", f) muss f ein flieskomma variable sein, oder ein
Fliesskomma Ergebnis.

Richtig:

double f;
int i;

printf("%f",f);
printf("%f",i/2.0);

falsch:
int i;

printf("%f",i);
printf("%f",i/2);

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.