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 !!
dann schau dir dir Doku zu printf oder fprintf an.
Ich glaub, ich sollte der Vollständigkeit halber noch sprintf() erwähnen, damit geht das auch!
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
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 :-)
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!
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 :-)
>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.
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
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 !!
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?)
>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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.