mikrocontroller.net

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


Autor: Extra (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
unsigned char test[20];
....
test = "159.9568";
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

Autor: Björn R. (sushi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es wird optimalere Methoden geben, aber so müsste es zumindest schonmal 
funktionieren:
float z=0.0;
float m=1.0;
char* zeiger;
//herausfinden, wo der Punkt ist
zeiger=test;
while(((*zeiger)!='\0')&&((*zeiger)!='.'))
{
  m=m*10;
  zeiger++;
}
zeiger=test;
while((*zeiger)!='\0')
{
  if(*zeiger!='.')
  {
    z+=((*zeiger)-48)*m;
    m/=10;
  }
}

in z steht dann der zahlenwert des strings.
LG, Björn

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
atof

Autor: Björn R. (sushi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wieder was gelernt ;-)

Autor: Extra (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also dann in etwa so:
unsigned char test[20];
float nurzumrechnen;
....
test = "159.9568";
nurzumrechnen = atof(test);
nurzumrechnen = nurzumrechnen * 5.5963;
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

Autor: ich (Gast)
Datum:

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

Autor: Extra (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: P. S. (Gast)
Datum:

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

Autor: Extra (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>warning: implicit declaration of function 'sprintf'

Ist doch nur ein warning ;)

>Muss ich noch etwas machen, damit es klappt?

#include <stdio.h>

Autor: Extra (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Extra (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
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.

Autor: ich (Gast)
Datum:

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

Autor: Extra (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Extra (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Extra (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
strtod

Autor: Extra (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab jetzt mal folgendes gemacht:
char kmh_string[4];
double kmh;
...
kmh = 15.2569;
sprintf(kmh_string,"%f",kmh);
lcd_string(kmh_string);

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

Gruß, Extra

Autor: Extra (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: B e r n d W. (smiley46)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.