Strin in Integer(uint16_t) umwandeln

OP #1208821
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
#1208850
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!
#1208853
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?
#1208944
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.
OP #1208962
***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!!!
#1208980
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.