PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Stringkonvertierung to Float



walterk
10.01.2010, 15:49
Hallo Forum,

mit dem Code eins möchte ich aus dem string die beiden Zahlenwerte als float herausknödeln. Die Forumssuche und mein 2kg/1000Seiten/1CD Buch c von A bis Z brachten leider nicht den erhofften Erkenntnisgewinn.

Der String wird in //eins: in vier Teile zerlegt, bei der Umwandlung in float gibt //eins: einen Komilierfehler aus.

Um den Fehler einzugrenzen, habe ich in //zwei: die Routine strtof explizit ausgeführt, hier wird der String in einen völlig anderen Wert umgewandelt.

Umgebung: Fedora10+gcc

Was mache ich da falsch?

Danke für die Antworten.





#include <stdio.h>
#include <string.h>

//eins:

int main (void){
char string[] = "AZ234.7 EL345.6";
int i = 1;
char *ptr;
float az, el;

ptr = strtok(string, "Z L");
while(ptr != NULL){

if(i == 2){
az = strtof(%s,NULL); //kompilerfehler %s
}

if(i == 4){
el = strtof(%s,NULL); //kompilerfehler %s
}

printf("%d. Wort: %s\n",i++,ptr);
ptr = strtok(NULL, " L");
}
return 0;
}

//zwei:

int main (void){

float x;
char string[] = "341.9";
x = strtof(string, NULL);
printf("\ndas ist der float %f", x);//falscher Wert
printf("\n");
}

sternst
10.01.2010, 16:37
az = strtof(%s,NULL); //kompilerfehler %s Was hast du dir gedacht, was das %s darstellen soll?


float x;
...
printf("\ndas ist der float %f", x);//falscher Wert %f ist der Platzhalter für ein double, nicht für ein float.

walterk
10.01.2010, 18:19
Hallo sternst,

danke für deine Antwort.

Habe einerseits %f durch %g mit float ersetzt und andererseits float durch double mit %f. Das Ergebnis war ebenso unrichtig wie vor dem ersten Post.

Was schlägst du vor?

Der Platzhalter %s wurde bereits durch den Kompiler beanstandet.

--> x = strtof(string, NULL); <--

Wie würdest du den betreffenden Teilstring hier hineinbringen?
Gibt es hier eine fertige Bibliotheksfunktion oder ist eine for-Schleife und eine Indexvariable das Mittel der Wahl?

Danke für die Antworten.

sternst
10.01.2010, 18:47
Habe einerseits %f durch %g mit float ersetztAuch %g ist für ein Double.

und andererseits float durch double mit %f. Das Ergebnis war ebenso unrichtig wie vor dem ersten Post.
Zeige, was genau du probiert hast.


--> x = strtof(string, NULL); <--

Wie würdest du den betreffenden Teilstring hier hineinbringen?
ptr zeigt auf den Teilstring, genau das ist schließlich der Zweck von strtok. Also:
x = strtof(ptr, NULL);

walterk
10.01.2010, 19:58
Zeige, was genau du probiert hast.




int main (void){
char string[] = "AZ234.7 EL345.6";
int i = 1;
char *ptr;
double az, el;

ptr = strtok(string, "Z L");
while(ptr != NULL){

if(i == 2){
az = strtof(ptr,NULL);
}
printf("Der %d. Wert ist %f.\n",i,az);

if(i == 4){
el = strtof(ptr,NULL);
}
printf("Der %d. Wert ist %f.\n",i,el);

printf("%d. Wort: %s\n",i++,ptr);
ptr = strtok(NULL, " L");
}
return 0;
}



Deine Ratschläge umgesetzt

sternst
10.01.2010, 20:31
Deine Ratschläge umgesetztUnd jetzt geht es, oder geht es nicht, oder was?
Und wenn nicht, dann zeige doch mal die Ausgabe.

walterk
11.01.2010, 21:28
Hallo sternst,

dies ist die Ausgabe des Codes von oben. Statt der langen Ganzzahl habe ich die Werte von Wort 2 und 4 erwartet. Die langen Ganzzahlen machten auf mich den Eindruck einer Speicheradresse. Nach Änderungen im Bereich Pointer gabs Kompilerfehlermeldungen.

Ausgabe Code von oben:

<ausgabe>
Der 1. Wert ist 0.000000.
Der 1. Wert ist 0.000000.
1. Wort: A
Der 2. Wert ist 1124073472.000000.
Der 2. Wert ist 0.000000.
2. Wort: 234.7
Der 3. Wert ist 1124073472.000000.
Der 3. Wert ist 0.000000.
3. Wort: E
Der 4. Wert ist 1124073472.000000.
Der 4. Wert ist 1132462080.000000.
4. Wort: 345.6
</ausgabe>

Danke für deine Mühe.

sternst
11.01.2010, 23:11
Wenn du mit -Wall übersetzt, bekommst du nicht zufällig ein
" warning: implicit declaration of function 'strtof'"
oder?

walterk
12.01.2010, 20:40
Ja, genau so ist es.

Zusätzlich zu den beiden includes stdio.h und string.h habe ich nun auch strings.h und stdlib.h verwendet, leider keine Änderung des Verhaltens.

Was schlägst du vor?

sternst
12.01.2010, 21:51
strtof gehört zu stdlib.h, aber erst seit C99. Zusätzlich zum Inkluden von stdlib.h musst du also auch noch den vom Compiler benutzten Standard richtig setzen, also entweder "--std=c99" oder "--std=gnu99" benutzen.

walterk
13.01.2010, 15:39
Danke, jetzt funktioniert es!

Mit beiden von dir angegebenen Optionen, mit Fedora und gcc sind die Ausgaben wie beabsichtigt.

Nun möchte ich diesen Code als Teil eines µC Programms auf einem Atmega32 verwenden, der mit AVR-Studio4.18 und Vista beschrieben wird.

Ist AVR-Studio 4.18 c99 konform?
Was sollte ich sonst noch beachten?

sternst
13.01.2010, 23:46
Ist AVR-Studio 4.18 c99 konform?Da das AVR-Studio keinen C-Compiler enthält, hat die Frage keinen Sinn. ;-)

Der normalerweise zusammen mit dem AVR-Studio verwendete AVR-GCC ist C99 konform, und das vom AVR-Studio generierte Makefile hat auch schon per Default eine entsprechende Option gesetzt.

walterk
16.01.2010, 15:30
Hallo sternst,

werde nun die Hardware preisvergleichen und bestellen.
Danke nochmals für deine Hilfe.

Walter