Hallo,
ich habe eine Zahlenreihe (z.B. 25,6), die als char initialisiert ist
(muss wegen anderen Sachen im Programm so sein).
Nun will ich diese Zahlenreihe mit einer Zahl (z.B. 1,5926)
multiplizieren. Das geht ja aber nicht ohne weiteres, da die Zahlenreihe
ja als char initialisiert ist. Also muss ich doch die char- Zahlenreihe
in eine als Integer initialisierte Variable umwandeln.
Wie macht man das?
Gibt es dazu irgendwelche speziellen Funktionen?
Dann noch etwas: Ich habe einige solcher Zahlen in mit Integer
initialisierten Variablen gespeichert, und wandle diese mit z.B.:
1
itoa(temp,empfangen[1],10);
in eine char-Variable um.
Nun bringt mein WinAVR- Plugin bei jedem dieser Vorgänge die Warnung:
../Projekt.c:43: warning: passing argument 2 of 'itoa' makes pointer
from integer without a cast
Wieso kommt diese Warnung?
Gruß, Bastler
Bastler wrote:
> Hallo,> ich habe eine Zahlenreihe (z.B. 25,6), die als char initialisiert ist> (muss wegen anderen Sachen im Programm so sein).> Nun will ich diese Zahlenreihe mit einer Zahl (z.B. 1,5926)> multiplizieren. Das geht ja aber nicht ohne weiteres, da die Zahlenreihe> ja als char initialisiert ist. Also muss ich doch die char- Zahlenreihe> in eine als Integer initialisierte Variable umwandeln.
Nein. Das Produkt aus einem int8 oder int16 und 1,5926 wird niemals ohne
Nachkommastellenverlust in einen ganzzahligen Typ beliebiger Länge
passen.
> Wie macht man das?> Gibt es dazu irgendwelche speziellen Funktionen?
Du willst das Ergebniss in einem float oder double ablegen.
Ob du das auf einem AVR willst ist aber wieder ein anderes Thema.
> Dann noch etwas: Ich habe einige solcher Zahlen in mit Integer> initialisierten Variablen gespeichert, und wandle diese mit z.B.:>
1
>itoa(temp,empfangen[1],10);
2
>
> in eine char-Variable um.>> Nun bringt mein WinAVR- Plugin bei jedem dieser Vorgänge die Warnung:> ../Projekt.c:43: warning: passing argument 2 of 'itoa' makes pointer> from integer without a cast>> Wieso kommt diese Warnung?
itoa() erwartet empfangen[1] als reference.
> Gruß, Bastler
liebe grüße
frank
Danke für deine Antwort!!!
Wenn am Ende noch 1 oder 2 Nachkommastellen da sind, reicht das immer
noch gut, da die Messgenauigkeit schon nicht so hoch ist.
Ich will das Ergebnis der Umwandlung in einem double oder float ablegen
(geht auch integer?). Das ganze soll auf einem ATmega8 geschehen, hatte
ich vergessen anzugeben.
Wie kann ich dieses empfangen[1] als reference einstellen, sodass keine
Felhlermeldung mehr kommt?
Gruß, Bastler
Bastler wrote:
> Danke für deine Antwort!!!>> Wenn am Ende noch 1 oder 2 Nachkommastellen da sind, reicht das immer> noch gut, da die Messgenauigkeit schon nicht so hoch ist.
Nunja, ganzzahlige Datentypen wie char, int und long haben die
Eigenschaft nur ganze Zahlen aufnehmen zu können, deshalb heißen sie so.
Das bedeutet für deinen Fall den Verlust aller Nachkommastellen (ohne
Rundung versteht sich).
> Ich will das Ergebnis der Umwandlung in einem double oder float ablegen> (geht auch integer?).
Ja. Wenn du auf alle Nachkommastellen verzichtest und castest.
> Das ganze soll auf einem ATmega8 geschehen, hatte> ich vergessen anzugeben.
Wie man so hört sollen Fließkommazahlen nicht so die starke Seite von
AVR 8bit sein. Tricks und Kniffe wie man das performant hinbekommt kann
ich dir allerdings keine geben, da ich das bisher noch nie wirklich
gebraucht habe. Unter Unständen reicht dir der Code den der avr-gcc
ausspuckt wenn du das mit ANSI-C abfackelst ja auch aus in deinem
Projekt.
> Wie kann ich dieses empfangen[1] als reference einstellen, sodass keine> Felhlermeldung mehr kommt?
Ich habe gerade noch einmal nachgeschaut und muß feststellen, daß ich
etwas voreilig war. itoa() liefert einen nullterminierten String an
eine Array-Reference. Du brauchst also ein hilfsarray wenn dir itoa()
nicht empfangen[2] überschreiben soll. Nimm dir also z.B. char result[5]
und übergebe das als &result. Die Länge richtet sich nach den zu
erwartenden Stellen von temp, da du wie oben zu sehen, das Ergebniss in
einem char unterbringen kannst wird dir vermutlich result[2] reichen. Du
mußt nach der Umwandlung dann noch das Ergebnis zuweisen: empfangen[1] =
result[0];
Dann bist du \0 wieder los.
> Gruß, Bastler
liebe grüße
frank
Ich mach hier mal die Ingrid:
>> Ich will das Ergebnis der Umwandlung in einem double oder float ablegen>>> (geht auch integer?).>> Ja. Wenn du auf alle Nachkommastellen verzichtest und castest.
Das bezieht sich natürlich nur auf "geht auch integer". In float und
double sind selbstverständlich Nachkommastellen möglich wie sich auch in
jedem C Grundlagenbuch nachlesen lässt.
[...]
> Ich habe gerade noch einmal nachgeschaut und muß feststellen, daß ich> etwas voreilig war. itoa() liefert einen nullterminierten String an> eine Array-Reference. Du brauchst also ein hilfsarray wenn dir itoa()> nicht empfangen[2] überschreiben soll. Nimm dir also z.B. char result[5]> und übergebe das als &result. Die Länge richtet sich nach den zu> erwartenden Stellen von temp, da du wie oben zu sehen, das Ergebniss in> einem char unterbringen kannst wird dir vermutlich result[2] reichen. Du> mußt nach der Umwandlung dann noch das Ergebnis zuweisen: empfangen[1] => result[0];> Dann bist du \0 wieder los.
Solltest du wider Erwarten mehr als ein Char brauchen wird in der
Zuweisung eine for-Schleife samt Laufindex oder ein Pointer nötig.
Wenn empfangen[2] ohnehin die Nullterminierung beherbergt kann man auf
das Hilfarray natürlich verzichten und direkt &empfangen[1] übergeben.
liebe grüße
frank
Ok, danke für deine Erklärungen!!
Wie man jetzt genau den String in die float oder double Variable (mit
Nachkommastellen) umwandeln kann, hab ich bis jetzt noch nicht
verstanden....
Gruß, Steffen
> Wie man jetzt genau den String in die float oder double Variable (mit> Nachkommastellen) umwandeln kann, hab ich bis jetzt noch nicht> verstanden....
Guckst Du bei sscanf.
Am besten in der Dokumentation zur Library.
Ein normales C-Büchlein könnte da Optionen anführen, die es in der
Library nicht gibt.
Bisher war nicht davon die rede daß ein String in ein float gewandelt
werden soll, dafür gibt es atof().
Willst du eine Ganzzahl die im Datentyp char steht mit einem float
multiplizieren geht das so:
char c = 5;
float f;
f = c * 1.5926;
Evtl. haben ich aber auch deine Ausgangsfrage falsch verstanden...
liebe grüße
frank
@ Frank Lorenzen (florenzen)
>Wie man so hört sollen Fließkommazahlen nicht so die starke Seite von>AVR 8bit sein.
Geht so.
> Tricks und Kniffe wie man das performant hinbekommt kann>ich dir allerdings keine geben, da ich das bisher noch nie wirklich>gebraucht habe.
Der Trick heisst Festkommaarithmetik.
MFG
Falk
Genau, in einer mit char initialisierten Variable steht eine Kommazahl.
Und diese Zahl will ich nun mit einer Zahl (nicht Variable)
multiplizieren. Hier mal ein Bsp:
1
unsignedcharempfangen[5];
2
floatkmh;
3
4
empfangen="25,6";
5
6
kmh=empfangen*1,5926
Ich hoffe das Bsp ist so richtig. Um diese Multiplikation auszuführen,
muss ich doch die Variable empfangen davor z.B. in eine mit float
initialisirte Variable umwandeln, weil wenn ich es so mache, wie es da
steht, kommt eine Errormeldung.
Muss ich da die Funktion atof() verwenden, um die Variable empfangen in
eine float Variable umzuwandeln?
Welche Werte müssen der Funktion atof() übergeben werden, damit sie
funktioniert?
So wie bei itoa?
Gruß, Steffen
@ Bastler (Gast)
>Genau, in einer mit char initialisierten Variable steht eine Kommazahl.>Und diese Zahl will ich nun mit einer Zahl (nicht Variable)
Das nennt man Konstanze, ähh Konstante. ;-)
>Ich hoffe das Bsp ist so richtig.
Nö, weil man einen String nicht mit einer Zahl multiplizieren kann.
>muss ich doch die Variable empfangen davor z.B. in eine mit float>initialisirte Variable umwandeln, weil wenn ich es so mache, wie es da>steht, kommt eine Errormeldung.
Logisch ;-)
>Muss ich da die Funktion atof() verwenden, um die Variable empfangen in>eine float Variable umzuwandeln?
Emfpangen musst du per UARt oder sonstwie. atof() wandelt nur den Sting
in eine Flieskommazahl.
>Welche Werte müssen der Funktion atof() übergeben werden, damit sie>funktioniert?
Der String, der die Zahl enthält?
>So wie bei itoa?
RTFM.
MFG
Falk
Wird nun auch ohne Fehlermeldung so erstellt, und klappt warsch. auch.
Aber nun kommen plötzlch Fehlermeldungen bei der Funktion uart_getc():
Projekt.c:23: undefined reference to `uart_getc'
Ich habe aber die UART library von Peter Fleury mit #include "uart.h"
eingebunden. Woher kommen dann diese Fehlermeldungen?
Gruß, Steffen
> Aber nun kommen plötzlch Fehlermeldungen bei der Funktion uart_getc():> Projekt.c:23: undefined reference to `uart_getc'>> Ich habe aber die UART library von Peter Fleury mit #include "uart.h"> eingebunden. Woher kommen dann diese Fehlermeldungen?
Du musst nicht nur die Header-Datei einbinden, sondern auch die C-Datei
übersetzen und die daraus resultierende Objekt-Datei dazulinken.
Ok, ich hab nun die .h- Datei einfach noch als eine .c- Datei
abgespeichert, und dem Projekt hinzugefügt. Nun sind die Fehlermeldungen
weg, aber folgende ist hinzugekommen:
../../../uart.c:84:2: error: #error "size of UART_RX_BUFFER_SIZE +
UART_TX_BUFFER_SIZE larger than size of SRAM"
Kann ich in der lib irgendwo die Buffergröße kleiner machen, damit es
noch auf meinem Mega8 läuft?
Gruß, Steffen
Steffen O. wrote:
> Ok, ich hab nun die .h- Datei einfach noch als eine .c- Datei> abgespeichert, und dem Projekt hinzugefügt.
Ähm ... tja ... ich weiß nicht so recht, was ich dazu sagen soll.
Downloade dir erstmal die richtige C-Datei.