mikrocontroller.net

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


Autor: Bastler (Gast)
Datum:

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

Autor: Frank Lorenzen (florenzen)
Datum:

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

itoa() erwartet empfangen[1] als reference.

> Gruß, Bastler

liebe grüße
frank

Autor: Bastler (Gast)
Datum:

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

Autor: Frank Lorenzen (florenzen)
Datum:

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

Autor: Frank Lorenzen (florenzen)
Datum:

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

Autor: Bastler (Gast)
Datum:

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

Autor: double (Gast)
Datum:

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

Autor: Frank Lorenzen (florenzen)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
unsigned char empfangen[5];
float kmh;

empfangen = "25,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

Autor: Falk Brunner (falk)
Datum:

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

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, nun hab ich die Funktion so verwendet:
unsigned char empfangen[5];
float kmh,nurzumrechnen;

empfangen="25.6"

nurzumrechnen=atof(empfangen);
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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Frank Lorenzen (florenzen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:

[...]
> Der Trick heisst Festkommaarithmetik.

Danke Falk.
Ich werds mir merken ;)

> MFG
> Falk


liebe grüße
frank

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.