Forum: Compiler & IDEs Double to String C


von Marcel O. (Gast)


Lesenswert?

Guten Tag,
Es gibt zwar schon genügend Threads über dieses Thema, und ich habe auch 
schon diverse Codezeilen gelesen, jedoch manche nicht ganz verstanden.
Bis ich auf diese paar Zeilen gestoßen bin:

void updateView(double number)
{
  char value[100];
  sprintf(value,"%g",number);
}

Bei den kommenden Funktionen, die auch funktionieren, gebe ich einen 
String entsprechend der X und Y Position auf mein EA DOGL128-6 Display 
aus.
(Verwundung eines ATMEGA328p)

char_x=90;//0-128
char_y=2; //0-8
display_write("Hallo");

Da ich jetzt aber einen Double-Wert ausgeben möchte und diese Funktion 
nur für Strings geeignet ist, habe ich mich nach einer Double to String 
Umwandlung umgeschaut.
Doch leider funktioniert dies nicht:

double number = 10;

char_x=90;//0-128
char_y=2; //0-8

sprintf(value,"%g",number);     //Umwandlung double to string

display_write("value");

danke schonmal für eure Hilfe!

lg
Marcel

von Helfer (Gast)


Lesenswert?

> void updateView(double number)
> {
>   char value[100];
>   sprintf(value,"%g",number);
>   display_write("value");
>                 ^     ^
> }

1) display_write(value);

2) char value[100]; ist eine lokale Variable, die nur innerhalb 
updateView() gültig ist. Deine Ausgabefunktion display_write() muss dann 
innerhalb updateView() aufgerufen werden. Oder du machst char 
value[100]; zu einer globalen Variable.

von Helfer (Gast)


Lesenswert?

3) Schau dir die Funktionen dtostre() und dtostrf() aus der Library an. 
Die sind eventuell platzsparender als das relativ fette sprintf().

von Marcel O. (Gast)


Lesenswert?

Danke schonmal für so eine schnelle Antwort !

Funktion dtostrf:

char* dtostrf   (double val,char width,char prec,char *s)


Width sagt mir jetzt auf die schnelle nichts.
prec wird die Anzahl der Nachkommastellen sein.

und warum kommt beim char teilweise ein " * " vor ?

lg

von Helfer (Gast)


Lesenswert?

C-Grundlagen 2. oder 3. Stunde im C-Kurs

"das ist eine Stringkonstante" und "value" ist eine andere.

char value[100]; ist ein Feld von 100 chars

Man kann eine Stringkonstante in ein char Feld speichern

char value[100] = "das ist eine Stringkonstante";

Möchte man die Stringkonstante ausgeben, kann man sie direkt ausgeben:

display_write("das ist eine Stringkonstante");

Oder man kann die Kopie aus dem Feld ausgeben, in dem man die Adresse 
des ersten Zeichens als Argument übergibt

display_write(&value[0]);

Oder aquivalent in kürzerer Schreibweise ohne &...[0]

display_write(value);

von Helfer (Gast)


Lesenswert?

Bei dtostrf brauchst du nicht raten, dafür gibt es eine Doku:
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga060c998e77fb5fc0d3168b3ce8771d42

Also z.b. 10.0 ausgeben

dtostrf(10, 2, 1, value);

oder

dtostrf(number, 2, 1, &value[0]);

Das char *s in der Beschreibung ist ein weiterer Datentyp aus der 4. 
oder 5 C-Stunde: Ein Zeiger (Pointer) auf ein char.

Du kennst schon &value[0] als Adresse des ersten Zeichens in deinem Feld 
value. Die kannst (musst) du an dieser Stelle übergeben.

von Helfer (Gast)


Lesenswert?

> dtostrf(10, 2, 1, value);

Doku hätte ich selber genauer lesen sollen :)

dtostrf(10, 4, 1, value);
            ^  2 Vorkommastellen + 1 Dezimalzeichen + 1 Nachkommastelle

Bei dem ganzen nicht vergessen: libm.a ins Projekt aufnehmen.
http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio

von Marcel O. (Gast)


Lesenswert?

Na ich wusste schon, dass es sich dabei um strings und dergleichen 
handelt!
Verwirrt hat mich nur der Stern bzw. Malpunkt *

zb.

char* dtostrf   (double val,char width,char prec,char *s)
    ^                                                 ^
    |                                                 |

ok, werde mich dann mit dem weiterbeschäftigen

danke schön

lg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Marcel Ofitsch schrieb:
> Na ich wusste schon, dass es sich dabei um strings und dergleichen
> handelt!
> Verwirrt hat mich nur der Stern bzw. Malpunkt *

Das widerspricht sich.

Bevor Du weiterstoppelst: Kauf Dir ein C-Buch. Und lies es durch.

Empfehlung:
Brian Kernighan & Dennis Ritchie, "Programmieren in C", 2. Ausgabe, 
Hanser-Verlag.

Ist zwar schon 20 Jahre alt, aber immer noch das Buch, das einem alles 
relevante über C vermittelt.

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.