Forum: PC-Programmierung Frage zur Umwandlung von einem Zeichen-String in eine double Zahl!


von J. R. (cia_man)


Lesenswert?

Hallo!

Mein Problem: Ich möchte eingelesene Zahlen in eine double-Konstante 
umwandeln.

Die Zahlen lese ich als String ein (mit char).

DANKE!

Im Handbuch steht dazu folgender Hinweis:

1
double atof(const char *s)

Bloß der Befehl funktioniert so nicht?

: Verschoben durch Admin
von U.R. Schmitt (Gast)


Lesenswert?

Jochen R. schrieb:
> Bloß der Befehl funktioniert so nicht?

Ist das eine Frage? Dann probiere es aus.

Jochen R. schrieb:
> double atof(const char *s)
Was bedeutet denn
1
const char *s
 speziell der Stern?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jochen R. schrieb:
> Die Zahlen lese ich als String ein (mit char).
Wie meinst du das?

Zeig doch mal ein wenig mehr Code...

> Bloß der Befehl funktioniert so nicht?
WAS funktioniert so nicht?

Und dann noch der Rest:
welche Plattform, welcher Compiler, welche Version?

von J. R. (cia_man)


Lesenswert?

U.R. Schmitt schrieb:
> Jochen R. schrieb:
>> Bloß der Befehl funktioniert so nicht?
>
> Ist das eine Frage? Dann probiere es aus.
>
> Jochen R. schrieb:
>> double atof(const char *s)
> Was bedeutet denn
1
const char *s
 speziell der Stern?

converts the initial characters in s into a double and returns it.

So steht es im Handbuch!

1
double I1 =0;
2
3
.
4
. code...
5
.
6
7
I1 = double atof (strom1);

so sieht mein Code aus!

Warum sagt er mir dann.... illegal expression??? Des müsste doch so 
gehen oder???

DANKE!

von J. R. (cia_man)


Lesenswert?

Lothar Miller schrieb:
> Jochen R. schrieb:
>> Die Zahlen lese ich als String ein (mit char).
> Wie meinst du das?
>
> Zeig doch mal ein wenig mehr Code...
>
>> Bloß der Befehl funktioniert so nicht?
> WAS funktioniert so nicht?
>
> Und dann noch der Rest:
> welche Plattform, welcher Compiler, welche Version?

Plattform: Freescale HC12 , imagecraft, V7

Fehler kommen heraus siehe oben!

DANKE!

von und nochmal (Gast)


Lesenswert?

U.R. Schmitt schrieb:

> Was bedeutet dennconst char *s speziell der Stern?

Um dir das googeln zu ersparen...

http://www.c-howto.de/tutorial-zeiger.html

von U.R. Schmitt (Gast)


Lesenswert?

und nochmal schrieb:
> U.R. Schmitt schrieb:
>
>> Was bedeutet dennconst char *s speziell der Stern?
>
> Um dir das googeln zu ersparen...
>
> http://www.c-howto.de/tutorial-zeiger.html
Leute ich weiss was der Stern bedeutet! Ich wollte dem TO die 
gelegenheit geben was zu lernen.

Jochen R. schrieb:
> I1 = double atof (strom1);
Warum wohl einen Syntax Fehler?? Warum schreibst du da nochmal double 
dazu?
Wie ist strom1 definiert?
hast du schon jemals c programmiert?
Du brauchst ein C Buch!
Und solltest erst mal darin lesen!

von Retender (Gast)


Lesenswert?

double atof(const char *s):

double test;
char * deinzahlstring = "45";

test = atof(deinzahlstring);

printf("%i",test);

von Retender (Gast)


Lesenswert?

sorry, natürlich printf("%f", test);

von J. R. (cia_man)


Lesenswert?

Retender schrieb:
> double atof(const char *s):
>
> double test;
> char * deinzahlstring = "45";
>
> test = atof(deinzahlstring);
>
> printf("%i",test);

Ich habe jetzt aber die oberste Zeile nicht! Braucht man die wirklich?
1
//Umwandlung der eingelesenen Werte in double
2
3
I1 = atof (strom1);
4
I2 = atof (strom2);
5
I3 = atof (strom3);
6
I4 = atof (strom4);

so sieht jetzt mein Programm aus! Wobei die Is als double definiert 
wurden.

Ich bekomme nun auch keine Fehler mehr! Von daher denke ich mal, dass 
das gehen müsste.

Was meint ihr?

Und wie kann ich bei dem Imagecraft-Compiler die internen Werte der 
Variablen anschauen also debuggen? Weiß das hier jmd?

DANKE für eure Geduld ;)

von J. R. (cia_man)


Lesenswert?

Zum Thema debuggen hab ich mir selber geholfen! ;)

Einfach die Visual Studio Express C++ Version verwenden :)

Damit kann man den C Code debuggen!

von cskulkw (Gast)


Lesenswert?

Jochen R. schrieb:
> converts the initial characters in s into a double and returns it.
>
>
>
> So steht es im Handbuch!
>
>
>
>
>
> double I1 =0;
>
>
>
> .
>
> . code...
>
> .
>
>
>
> I1 = double atof (strom1);
>
>
>
>
>
>
>
> so sieht mein Code aus!
>
>
>
> Warum sagt er mir dann.... illegal expression??? Des müsste doch so
>
> gehen oder???

Wenn Du eine Typumwandlung durchführen willst und Dein Compiler einen 
nicht zulässigen Ausdruck moniert, dann mach doch einmal runde Klammern 
um das double. Und zwar so...

Il = (double) atof(stroml);

Im Embedded C besagen die Klammern, dass hier ein CAST durchgeführt 
werden soll.

Sollte das nicht funktionen, dann versuche zunächst die Variable Il auf 
den Typ zu deklarieren, der dem Rückgabewert von atof entspricht. Hier 
wäre das also float.

Wenn das alles nichts hilft, dann poste doch bitte den vollständigen 
Fehlerkommentar. Damit erhöhen sich die Chance, herauszufinden, wass da 
nicht funktioniert.

Übrigens, weißt Du gar, ob der Code nicht funktioniert. Er ist ja noch 
gar nicht kompiliert.

von J. R. (cia_man)


Lesenswert?

Eine andere Frage:

Wie kann ich von double in char wandeln???

mit ltoa???

DANKE!

von DirkB (Gast)


Lesenswert?

ltoa bedeutet long to ascii. Also kein double.

Es geht mit sprintf.

Nebenbei, wie ist den strom1 bei dir deklariert?

von J. R. (cia_man)


Lesenswert?

1
char strom1[64];

Kannst du des mit dem sprintf etwas genauer erklären? ;)


THX!!

von DirkB (Gast)


Lesenswert?

sprintf heißt String PRINT Formated und schreibt nicht (wie printf) auf 
die Standardausgabe sondern in einen String.
1
sprintf(strom1,"%f",I1);

strom1 muss aber genug Platz haben.
Schau bei printf nach was da noch geht.

Statt atof solltest du besser strtod nehmen. Da kannst du auch Fehler 
erkennen.

von J. R. (cia_man)


Lesenswert?

Strom 1: 0 ->   kommt das! Obwohl 55 herauskommen müsste! Bzw stehen 
müsste.

1
I1 = atof (strom1);
2
3
sprintf(strom1,"%d",I1);
4
5
sci0_puts("\nStrom 1: ");
6
sci0_puts(strom1);

Wisst ihr warum das so ist? I1 ist double!

von DirkB (Gast)


Lesenswert?

Weil "%d" für Integer ist.
Ich schrieb auch "%f".

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Statt (s)printf kann natürlich auch dtostrf genutzt werden.

von J. R. (cia_man)


Lesenswert?

trotz dem f kommt immer noch 0 anstelle der Zahl??

von DirkB (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Statt (s)printf kann natürlich auch dtostrf genutzt werden.

Da hier das Unterforum PC-Programmierung ist, habe ich darauf 
verzichtet.

Schon mal I1 = 55; probiert?
Alle Libraries eingebunden?

von J. R. (cia_man)


Lesenswert?

DirkB schrieb:
> Rufus Τ. Firefly schrieb:
>> Statt (s)printf kann natürlich auch dtostrf genutzt werden.
>
> Da hier das Unterforum PC-Programmierung ist, habe ich darauf
> verzichtet.
>
> Schon mal I1 = 55; probiert?
> Alle Libraries eingebunden?

Welche brauche ich hierfür???

Mit I1= 55 geht es ??? Dann muss was beim Umwandeln schief laufen!?

Nur was?

von J. R. (cia_man)


Lesenswert?

Hab was herausgefunden! Diese Zeile beschreibt I1 gar nicht?!
1
I1 = atof (strom1);

Warum???? Kann mir jmd von euch helfen!

Ich habe nämlich gerade festgestellt, dass ich I1 = 0 bei der 
Initialisierung gesetzt habe. :)

Bloß es müsste dennoch später gehen... also die Umwandlung mit 
Speicherung auf I1???

von DirkB (Gast)


Lesenswert?

Dann probier nochmal
1
I1 = atof("55");

von J. R. (cia_man)


Lesenswert?

DirkB schrieb:
> Dann probier nochmal
>
1
I1 = atof("55");

Keine Veränderung :(

von DirkB (Gast)


Lesenswert?

Also macht atof nicht.
Geht
1
I1 = strtod("55", NULL);

von J. R. (cia_man)


Lesenswert?

DirkB schrieb:
> Also macht atof nicht.
> Geht
>
1
I1 = strtod("55", NULL);

Hab den Fehler gefunden stdlib.h hat gefehlt :(

Ey Freitag Mittag! Ich glaube ich mach Feierabend ^^ oder besser muss 
machen :D bei solchen Fehlern ^^

Aber DANKE!

von DirkB (Gast)


Lesenswert?

Das nächste mal auch die Compilerwarnungen beachten.
Und auch einschalten.

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.