Forum: Compiler & IDEs Strin in Integer(uint16_t) umwandeln


von Brun .. (brun)


Lesenswert?

Hallo Forum,

ich habe folgendes Problem.
Ich will ein String in einen 16Bit Integer umwandeln.
1
uint16_t zahl = 0;
2
char puffer[23];
3
4
uart_puts_P("\r\n");
5
uart_puts_P("Zahl als char: ");
6
uart_puts(puffer);
7
uart_puts_P("\r\n");
8
uart_puts_P("Zahl als uint16_t: ");
9
zahl = atoi(puffer);
10
itoa( zahl, buffer, 10);
11
uart_puts(buffer);
12
uart_puts_P("\r\n");

Soweit funktioniert das auch.
Aber sobald ich über die 32767 komme, bin ich im Minusbereich.

Zahl ist irgendwie nicht "unsigned" sondern "signed"
Benötigt wird aber ein "unsigned".

Hat von euch jemand eine Idee?


Gruß Brun

von Johannes M. (johnny-m)


Lesenswert?

atoi heißt "ASCII to int", und int ist nunmal vorzeichenbehaftet...

Zumindest in der AVR-libc gibt es afaik keine Funktion für /unsigned 
int/. Nur für unsigned long.

von Brun .. (brun)


Lesenswert?

Aber auch wenn ich "atol" benutze habe ich das selbe Problem...

von Johannes M. (johnny-m)


Lesenswert?

Brun Von der gönne wrote:
> Aber auch wenn ich "atol" benutze habe ich das selbe Problem...
Wenn überhaupt, dann atoul! Allerdings gibt es in der AVR-libc keine 
solche Funktion, sondern die heißt da strtoul. Du solltest vielleicht 
mal endlich offenlegen, mit welcher Lib Du arebitest!

von Karl H. (kbuchegg)


Lesenswert?

Dein Problem ist ja auch nicht mehr der atoi an sich.
Der liefert zwar einen int, aber bei der Zuweisung zum uint16_t passiert 
nichts grossartig Schlimmes. Das einzige was interessant ist, ist die 
Frage: Was macht eigentlich atoi wenn du ihm einen String mit einer Zahl 
vorwirfst, die Grösser als 32767 ist (ausprobieren oder Doku studieren)

Aber was denkst du wohl, wofür in die Gegenrichtung itoa stehen wird 
und von welchen Annahmen diese Funktion ausgehen wird, wenn du ihr ein 
16-bittiges Bitmuster vorwirfst?

von Brun .. (brun)


Lesenswert?

Benutzen tu ich die AVR Libc.

Wie bekommen ich denn aus den signed Interger einen unsigned Integer?
Einfach 65536 addieren?

von Karl H. (kbuchegg)


Lesenswert?

Brun Von der gönne wrote:
> Benutzen tu ich die AVR Libc.
>
> Wie bekommen ich denn aus den signed Interger einen unsigned Integer?
> Einfach 65536 addieren?

So wie es eine Funktion itoa gibt, gibt es auch eine Funktion utoa
Die benutzt du erst mal.
Dein Problem ist nicht das Bitmuster, welches in der Varaiblen steht. 
Dem Bitmuster kann nämlich niemand ansehen, ob da jetzt ein Vorzeichen 
dabei ist oder nicht. Das sind einfach nur 16 Bit.

Aber die Ausgabefunktion legt eine Interpretation fest:
itoa   :    Das Bitmuster enthält ein Vorzeichen
utoa   :    Das Bitmuster enthält kein Vorzeichen

Du stopfst jetzt deine 16-Bit Variable in itoa rein. Und gemäß seinem 
Auftrag interpretiert itoa da ein Vorzeichen rein, weil das i in itoa 
für int steht und ein int immer ein Vorzeichen hat.
utoa hingegen, gemäß seinem Auftrag, nimmt die 16 Bit so wies sie sind 
und interpretiert kein Vorzeichen rein, weil das u in utoa für unsigned 
(also: ohne Vorzeichen) steht.

von Brun .. (brun)


Lesenswert?

***Zaunpfahl angekommen...***

Jetzt hab ich es verstanden...

atoi() funktioniert schon die ganze Zeit richtig. Nur itoa() rechnet es 
als signed zurück.

mit utoa() funktioniert es.

Vielen Dank!
Ihr seit die Größten!!!

von Karl H. (kbuchegg)


Lesenswert?

Brun Von der gönne wrote:
> ***Zaunpfahl angekommen...***
>
> Jetzt hab ich es verstanden...
>
> atoi() funktioniert schon die ganze Zeit richtig. Nur itoa() rechnet es
> als signed zurück.

:-)
Ja jetzt hast du's.

Und beim nächsten mal erinnerst du dich an die Symptome (nämlich das 
eine unsigned Zahl plötzlich ein Vorzeichen in der Anzeige hat, was per 
Definition gar nicht sein kann) und lenkst deinen Verdacht gleich mal 
auf die Ausgabefunktion. So lernt man aus eigenen Fehlern und da du den 
letzten Erkentnisschritt selbst gemacht hast, vergisst du das auch nicht 
so schnell.

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.