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


von Stefan M. (picmic)


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 !!

von Random .. (thorstendb) Benutzerseite


Lesenswert?

sprintf wäre die einfachste...

von Peter (Gast)


Lesenswert?

dann schau dir dir Doku zu printf oder fprintf an.

von Peter (Gast)


Lesenswert?

s/fprintf/sprintf

von Frank B. (f-baer)


Lesenswert?

probiers mal mit sprintf()

von Vlad T. (vlad_tepesch)


Lesenswert?

schau dir sprintf an

von Random .. (thorstendb) Benutzerseite


Lesenswert?

**LOOOL**

von Karl H. (kbuchegg)


Lesenswert?

dtostrf()

von Sumynona (Gast)


Lesenswert?

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

von Peter D. (peda)


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

von Karl H. (kbuchegg)


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 :-)

von Stefan M. (picmic)


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:

1
long int rein;
2
char raus[15];
3
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.


1
double rein;
2
char raus[15];
3
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!

von Karl H. (kbuchegg)


Lesenswert?

Stefan Meier schrieb:

> Folgendes passiert bei der Benutzung von sprintf:
>
>
>
1
> long int rein;
2
> char raus[15];
3
> sprintf(raus, "%d", rein);
4
>
>
> 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!


>
1
> double rein;
2
> char raus[15];
3
> sprintf(raus, "%f", rein);
4
>
>
> 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 :-)

von Sigurd (Gast)


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.

von Peter D. (peda)


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

von Peter D. (peda)


Lesenswert?

Eine sehr codesparende formatierte Zahlenausgabe:

Beitrag "Formatierte Zahlenausgabe in C"


Peter

von Stefan M. (picmic)


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 !!

von Karl H. (kbuchegg)


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?)

von Helmut L. (helmi1)


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

von Peter D. (peda)


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

von Peter D. (peda)


Lesenswert?

P.S.:

Hier ist sie:

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


Peter

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.