mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Suche Methode zur Konvertierung von Double in String (in C)


Autor: Stefan Meier (picmic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich habe einen PIC16F690 uC mit LCD Display, ich kann darauf allerdings 
nur Character Strings ausgeben lassen. Ziel ist es eine Double Zahl mit 
Nachkommastellen (eine Nachkommastelle reicht, der Rest kann 
abgeschnitten werden) darzustellen.

Demnach suche ich nach einer Methode (in C) der ich eine Double Zahl 
uebergebe um dann einen Char String zurueckzukriegen.


DANKE und GRUESSE !!

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sprintf wäre die einfachste...

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann schau dir dir Doku zu printf oder fprintf an.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
s/fprintf/sprintf

Autor: Frank Bär (f-baer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probiers mal mit sprintf()

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schau dir sprintf an

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
**LOOOL**

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dtostrf()

Autor: Sumynona (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaub, ich sollte der Vollständigkeit halber noch sprintf() 
erwähnen, damit geht das auch!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sumynona schrieb:
> Ich glaub, ich sollte der Vollständigkeit halber noch sprintf()
> erwähnen, damit geht das auch!

Das wär dann also das 5. mal, ob das reicht?


Peter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Sumynona schrieb:
>> Ich glaub, ich sollte der Vollständigkeit halber noch sprintf()
>> erwähnen, damit geht das auch!
>
> Das wär dann also das 5. mal, ob das reicht?

da komme ich mir mit meinem einzelnen dtosrtf() richtig schäbig vor :-)

Autor: Stefan Meier (picmic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Schoen dass euch mein Problem belustigt :)
sprintf habe ich natuerlich ausprobiert bevor ich diesen Beitrag 
eingestellt habe.
Leider funktioniert es nicht.
Daher suchte ich direkt nach dem Sourcecode fuer eine derartige Methode, 
oder falls eine eine Loesung hat damit es mit sprintf funktioniert, 
gerne :)

Folgendes passiert bei der Benutzung von sprintf:

long int rein;
char raus[15];
sprintf(raus, "%d", rein);

Bis 12345 funktioniert das ganze, dann habe ich einen String mit 
"12345".
Setze ich z.B. rein=12345678 ist mein Ausgabestring eine willkuerliche, 
negative Zahl, die keinen Zusammenhang mit der Eingangszahl hat.


double rein;
char raus[15];
sprintf(raus, "%f", rein);

Dies fuehrt dazu dass in meinem Ausgabestring einfach nur "f" steht, 
unabhaengig von der eingegebenen double Zahl. Bei %e %E und %g %G 
passiert das selbe dann steht einfach "e E" oder "g G" im String.

Bedenkt dass das ganze auf einem PIC16F690 Microcontroller laeuft.
Wer hat eine Idee?

DANKE
Gruesse!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Meier schrieb:

> Folgendes passiert bei der Benutzung von sprintf:
>
>
>
> long int rein;
> char raus[15];
> sprintf(raus, "%d", rein);
> 
>
> Bis 12345 funktioniert das ganze, dann habe ich einen String mit
> "12345".

Nein. Es funktioniert nicht.
Das du da das gewünschte Ergebnis siehst, ist reiner Zufall. Es hätte zb 
auch einfach nur 0 sein können.
Die Formatspezifizierung für 'long int' ist %ld und nicht %d

> Setze ich z.B. rein=12345678 ist mein Ausgabestring eine willkuerliche,
> negative Zahl, die keinen Zusammenhang mit der Eingangszahl hat.

Siehste!


>
> double rein;
> char raus[15];
> sprintf(raus, "%f", rein);
> 
>
> Dies fuehrt dazu dass in meinem Ausgabestring einfach nur "f" steht,
> unabhaengig von der eingegebenen double Zahl. Bei %e %E und %g %G
> passiert das selbe dann steht einfach "e E" oder "g G" im String.

Ev. musst du eine spezielle Version der Runtime Library linken. Dein 
Problem könnte ganz einfach nur ein Problem der Benutzung deines 
speziellen Entwicklungssystems sein. Sagt der Hersteller irgendetwas 
dazu?

Funktioniert dtostrf() ?


> Schoen dass euch mein Problem belustigt :)
Was uns eigentlich immer wieder belustigt ist, wieviele es gibt die 
denken, sie könnten ohne vernünftige Literatur C lernen :-)

Autor: Sigurd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Was uns eigentlich immer wieder belustigt ist, wieviele es gibt die
>denken, sie könnten ohne vernünftige Literatur C lernen :-)

Trotz umfangreicher Literatur, trotz 5-Tage-Seminar in ANSI-C, manchmal 
war ich echt froh das es dieses Forum gibt.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Ev. musst du eine spezielle Version der Runtime Library linken.

Das wird mit Sicherheit der Fall sein.

Die float-Lib ist ein ziemlicher Brocken, deshalb ist sie default nicht
aktiviert bei den meisten MCs.
Genaueres steht in der Doku zu Deinem Compiler.


Interessant wäre auch, ob Dein PIC-Compiler überhaupt double kann.
Viele MC-Compiler setzen double einfach als float, was nach C-Standard 
erlaubt ist.
Also nicht wundern, wenn Deine Ergebnisse keine 64Bit Genauigkeit haben.

Manche PIC-Compiler haben sogar nur ein auf 24Bit reduziertes float.


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine sehr codesparende formatierte Zahlenausgabe:

Beitrag "Formatierte Zahlenausgabe in C"


Peter

Autor: Stefan Meier (picmic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Compiler ist: HI-TECH C Compiler 9.6
Die dem Compiler beigelegte stdlib.h enthaelt nichts zur dtostrf, habe
es gerade probiert, sie funktioniert in meinem Programm nicht.
Obwohl sie perfekt fuer meine Anwendung waere, habe mir grad die Library
Doc durchgelesen.
Bei sprintf funktioniert %ld auch nicht, das wird ebenfalls als "ld" im
String ausgebeben.
Das einzige was bei sprintf funktioniert ist %d bis 5 Stellen.
Scheint eine sehr abgespeckte Version zu von stdlib.h zu sein die dem
Compiler da beiliegt.
Weiss jemand ob ich eine beliebige stdlib.h in mein Programm einbinden
kann welche die dtostrf enthaelt (wo laed man die am Besten runter?)
oder gibt es dann Probleme weil der Compiler oder der PIC
Microcontroller die Befehle nicht versteht?

Danke und Gruesse !!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Meier schrieb:

> Obwohl sie perfekt fuer meine Anwendung waere, habe mir grad die Library
> Doc durchgelesen.

> Bei sprintf funktioniert %ld auch nicht, das wird ebenfalls als "ld" im
> String ausgebeben.
> Das einzige was bei sprintf funktioniert ist %d bis 5 Stellen.

> Scheint eine sehr abgespeckte Version zu von stdlib.h zu sein die dem
> Compiler da beiliegt.

Scheint wohl so.
Dass %f nicht funktioniert, ist zu verstehen, der Code dafür ist nicht 
unerheblich. Aber %ld nicht zu unterstützen ist schon arg. Der Code 
dafür ist trivial.

> kann welche die dtostrf enthaelt (wo laed man die am Besten runter?)

selber schreiben. Du wirst ja wahrscheinlich nicht die volle Bandbreite 
an Möglichkeiten inklusive Exponentendarstellung etc benötigen.

(PS: In welchem Bandbreitenbereich bewegen sich eigentlich deine 
auszugebenden Zahlenwerte?)

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Weiss jemand ob ich eine beliebige stdlib.h in mein Programm einbinden
>kann welche die dtostrf enthaelt

Was du brauchst ist neben dem Header-File auch die Bibliothek wo die 
Funktion enthalten ist. Das Header-File nuetzt dir allein gar nichts.

Gruss Helmi

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was im h-File nicht bekannt gemacht wird, wird erst recht nicht in der 
Lib sein.

Irgendwo gabs mal ne Tabelle, welcher PIC-Compiler einigermaßen ANSI-C 
kompatibel war.
Für die meisten Compiler sah die Tabelle garnicht gut aus.

Wenn Du etwas in der Doku zu Deinem Compiler nicht findest, wird es wohl 
auch nicht unterstützt.
Schau auch mal in die FAQs der Compiler-Webseite.


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P.S.:

Hier ist sie:

http://www.informel.de/pic/ccompiler.htm


Peter

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.