mikrocontroller.net

Forum: Compiler & IDEs float to ascii


Autor: my_ftoa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: my_ftoa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

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

Gruß,
Patrick...

Autor: my_ftoa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Old Bug:

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


Gruß   my_float

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Ortner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.