Forum: Compiler & IDEs GCC - Wie String in Integer umwandeln?


von Bastler (Gast)


Lesenswert?

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

von Frank L. (florenzen)


Lesenswert?

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

von Bastler (Gast)


Lesenswert?

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

von Frank L. (florenzen)


Lesenswert?

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

von Frank L. (florenzen)


Lesenswert?

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

von Bastler (Gast)


Lesenswert?

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

von double (Gast)


Lesenswert?

> 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.

von Frank L. (florenzen)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von Bastler (Gast)


Lesenswert?

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
unsigned char empfangen[5];
2
float kmh;
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

von Falk B. (falk)


Lesenswert?

@ 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

von Steffen O. (derelektroniker) Benutzerseite


Lesenswert?

Ok, nun hab ich die Funktion so verwendet:
1
unsigned char empfangen[5];
2
float kmh,nurzumrechnen;
3
4
empfangen="25.6"
5
6
nurzumrechnen=atof(empfangen);
7
kmh = nurzumrechnen * 1,5926;

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

von Stefan E. (sternst)


Lesenswert?

> 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.

von Steffen O. (derelektroniker) Benutzerseite


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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.

von Frank L. (florenzen)


Lesenswert?

Falk Brunner wrote:

[...]
> Der Trick heisst Festkommaarithmetik.

Danke Falk.
Ich werds mir merken ;)

> MFG
> Falk


liebe grüße
frank

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.