Forum: Compiler & IDEs Wie mit Zahlen, die in char- Variable stehen, rechnen?


von Extra (Gast)


Lesenswert?

Hallo,
wie kann ich mit einer Zahl, die in einer, als char initialisierten 
Variable steht, rechnen?

Hier mal ein Beispiel, wie ich es meine:
1
unsigned char test[20];
2
....
3
test = "159.9568";
4
test = test * 5.5963;

Ach so, die Konstante, mit der die Variable multipliziert wird ist eine 
Kommazahl...
Das ganze soll auf einem ATmega8 stattfinden, und es wird mit dem WinAVR 
Plugin programmiert...


Gruß, Exra

von Björn R. (sushi)


Lesenswert?

Es wird optimalere Methoden geben, aber so müsste es zumindest schonmal 
funktionieren:
1
float z=0.0;
2
float m=1.0;
3
char* zeiger;
4
//herausfinden, wo der Punkt ist
5
zeiger=test;
6
while(((*zeiger)!='\0')&&((*zeiger)!='.'))
7
{
8
  m=m*10;
9
  zeiger++;
10
}
11
zeiger=test;
12
while((*zeiger)!='\0')
13
{
14
  if(*zeiger!='.')
15
  {
16
    z+=((*zeiger)-48)*m;
17
    m/=10;
18
  }
19
}
in z steht dann der zahlenwert des strings.
LG, Björn

von Hannes (Gast)


Lesenswert?

atof

von Björn R. (sushi)


Lesenswert?

wieder was gelernt ;-)

von Extra (Gast)


Lesenswert?

Also dann in etwa so:
1
unsigned char test[20];
2
float nurzumrechnen;
3
....
4
test = "159.9568";
5
nurzumrechnen = atof(test);
6
nurzumrechnen = nurzumrechnen * 5.5963;
7
itoa(nurzumrechnen,test,10);

Aber wenn ich das so mache, sind die Nachkommastellen alle weg....
Liegt das an der itoa, oder der atof?

Gruß, Extra

von ich (Gast)


Lesenswert?

itoa wandelt ja nur int´s in Strings um und nicht float´s.
meine Lösung: sprintf(test,"%f",nurzumrechnen);
geht bestimmt besser...

von Extra (Gast)


Lesenswert?

Hmmm, ich hab nun deine Funktion mal eingefügt, und dann kommt beim 
Erstellen folgende Meldung:
warning: implicit declaration of function 'sprintf'

Ich hab aber die librarys libm.a und libprintf_flt.a schon 
hinzugefügt.....
Muss ich noch etwas machen, damit es klappt?

Gruß, Extra

von P. S. (Gast)


Lesenswert?

Mein Tip: C-Buch kaufen. Tip2: Solche Funktionen mal selbst schreiben, 
das sind gute Uebungsaufgaben.

von Extra (Gast)


Lesenswert?

Ich hab ein C-Buch, aber nur ein ganz Allgemeines Anfängerbuch, da steht 
printf drin, aber nicht sprintf....
Ich habe ehrlich gesagt keine Ahnung, wie ich das selbst schreiben 
könnte, außerdem will ich mich auf mein eigentliches Projekt 
konzentrieren, und nicht für alles eine eigene Funktion schreiben, wenn 
es bereits fertige gibt.

Gruß, Extra

von holger (Gast)


Lesenswert?

>warning: implicit declaration of function 'sprintf'

Ist doch nur ein warning ;)

>Muss ich noch etwas machen, damit es klappt?

#include <stdio.h>

von Extra (Gast)


Lesenswert?

Wenn ich stdio.h noch include, dann erhalte ich drei Fehlermeldungen, 
die ohne die lib nicht da sind. Zwei Fehler davon sind in meinem 
selbstgeschriebenen Programm, und einer in der library.
Woran liegt das, dass dann plötzlich Fehler da sind, die sonst nicht da 
waren?

Gruß, Extra

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


Lesenswert?

> Zwei Fehler davon sind in meinem selbstgeschriebenen Programm,
Ja, das glaube ich dir.
> und einer in der library.
Das nicht ;-)

> Woran liegt das, dass dann plötzlich Fehler da sind,
> die sonst nicht da waren?
Tja, da müsst man erst mal wissen welche das sind, oder?

von holger (Gast)


Lesenswert?

>Woran liegt das, dass dann plötzlich Fehler da sind, die sonst nicht da
>waren?

Das liegt an deinem Code. Da dieser sowie auch die Fehlermeldungen
scheinbar "Top Secret" sind, kann dir niemand helfen.

von Extra (Gast)


Angehängte Dateien:

Lesenswert?

So, ich hab den Sourcecode mal angehängt.
Der erste Fehler:
error: expected declaration specifiers or '...' before '(' token
(in der mit den vielen 1 markierten Zeile)

Der zweite Fehler:
error: number of arguments doesn't match prototype
(in der mit den vielen 2 markierten Zeile)

Der dritte Fehler:
...avr/include/stdio.h:771: error: prototype declaration
ist in dieser Codezeile der stdio.h lib:
1
extern int  fgetc(FILE *__stream);


Ich hoffe, das ist so verständlich...
Woran liegt das? Weil wenn ich, wie schon gesagt, #include <stdio.h> 
auskommentiere, dann sind alle drei Fehlermeldungen weg.

Gruß, Extra

PS: Der Code befindet sich noch im Entwickelstadium, daher ist auch noch 
so viel auskommentiert. Die lcd- lib ist aus dem wiki, und die UART- lib 
von Peter Fleury.

von ich (Gast)


Lesenswert?

Oh Gott ich hab noch nie [1] Array´s gesehen .....
Ganz schrecklicher Programmierstil.

von Extra (Gast)


Lesenswert?

Ja, aber wie soll ich es denn sonst machen, wenn ich eben eine char- 
Variable benötige, aber nur ein Zeichen ablegen will?
Klar, ich hätte die ganzen Temps zu einem Array zusammenfassen können, 
dann wäre es meiner Meinung nach aber unübersichtlicher geworden. Wobei 
das mit den Temps echt nicht gut gelöst ist, aber ich war nicht kreativ 
genug, um mir irgendwelche Namen einfallen zu lassen.
Und: Ich bin noch Anfänger in C....

Gruß, Extra

von ich (Gast)


Lesenswert?

"wenn ich eben eine char Variable benötige, aber nur ein Zeichen ablegen 
will"
Dass schreibt man aber generell so
char a;

und nicht :
char a[1];

Ich hab diese Schreibweise noch nie zuvor gesehen ....

Du hast doch auch int status benutzt und nicht int status[1]. Warum 
sollte das mit char nicht funktionieren. Char und int zeigen doch nur 
den Typ der Variable an und damit ihren Speicherbedarf/max inhaltliche 
Größe, mehr nicht.

von Extra (Gast)


Lesenswert?

Ok, das wusste ich noch nicht, ich dachte bei char muss man immer die 
Arraylänge mit angeben. Also, danke für den Hinweis....

von holger (Gast)


Lesenswert?

>int getchar()   //1111111111111111

Für getchar() gibt es einen Prototypen in stdio.h.
int getchar(void)
Und Fleury benutzt auch ein getchar().
int getchar()

Schreib das mal so:

int getchar(void)   //1111111111111111

Vieleicht hilft das schon.
Sonst getchar() einfach in uart_getchar() umbenennen.
Im gesamten Code versteht sich.

von Extra (Gast)


Lesenswert?

Vielen Dank holger, das wars!
Hab ich jetzt ehrlich gesagt gar nicht drangedacht, dass es den 
Funktionsnamen schonmal geben könnte.....
Naja, werde ich in Zukunft besser aufpassen beim Vergeben meiner 
Funktionsnamen.
Jetzt muss ich nurnoch testen, ob das mit sprintf funktioniert.

Gruß, Extra

von daniel (Gast)


Lesenswert?

strtod

von Extra (Gast)


Lesenswert?

Ich hab jetzt mal folgendes gemacht:
1
char kmh_string[4];
2
double kmh;
3
...
4
kmh = 15.2569;
5
sprintf(kmh_string,"%f",kmh);
6
lcd_string(kmh_string);

Es wird fehlerfrei erstellt, aber auf dem LCD erscheint nur ein ?
Was ist nun schon wieder nicht korrekt?

Gruß, Extra

von Extra (Gast)


Lesenswert?

Ich bin auch blöd, in eine Variable mit einem Speicherplatz von 4 
Zeichen passt nicht die Zahl 15.2569. Aber selbst wenn ich für 
kmh_string 10 Zeichen reserviere, kommt immernoch das Fragezeichen auf 
dem LCD.

Gruß, Extra

von Klaus Falser (Gast)


Lesenswert?

Ich glaube, Du mußt die richtige printf library dazulinken, welche mit 
Floating Point zahlen umgehen kann. Suche in der WinAVR Dokumentation 
nach der printf funktion.

von B e r n d W. (smiley46)


Lesenswert?

Warum willst Du denn Deine Variablen in Strings speichern?
Normalerweise macht man das andersrum. Die Variablen werden in float, 
long, int oder char gespeichert und nur zur Ausgabe in einen String 
gewandelt.

Eine double Variable braucht nur 8 Bytes, in "159.9568" befinden sind 
schon 9 Bytes. Einen String in eine float zu wandeln ist auch ziemlich 
rechenintensiv.

char string[20];
double kmh = 15.2569;

// für die Zahl mit 3 Nachkommastellen
sprintf(string, "V: %6.3f km/h", kmh);
// oder
dtostrf(kmh, 2, 3, string);

lcd_string(string);

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.