Wie mit Zahlen, die in char- Variable stehen, rechnen?

Gast #1019254
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
#1019267
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
Gast #1019746
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
Gast #1019782
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
Gast #1019792
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
Gast #1019878
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
Gast #1020083
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.
Gast #1020186
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.
Angehängte Dateien:
Gast #1020195
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
Gast #1020201
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.
Gast #1020207
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.
Gast #1020209
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
Gast #1020263
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
Gast #1020288
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
#1020528
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);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren