www.mikrocontroller.net

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


Autor: Brun ... (brun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

ich habe folgendes Problem.
Ich will ein String in einen 16Bit Integer umwandeln.
uint16_t zahl = 0;
char puffer[23];

uart_puts_P("\r\n");
uart_puts_P("Zahl als char: ");
uart_puts(puffer);
uart_puts_P("\r\n");
uart_puts_P("Zahl als uint16_t: ");
zahl = atoi(puffer);
itoa( zahl, buffer, 10);
uart_puts(buffer);
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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Brun ... (brun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber auch wenn ich "atol" benutze habe ich das selbe Problem...

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Brun ... (brun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benutzen tu ich die AVR Libc.

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Brun ... (brun)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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.