mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik atoi problem


Autor: Michael Endres (michael76)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

hab hier mal ein problem bei dem ich nicht so richtig weiter weis.

mein atmega16 bekommt über die rs232 zeichen gesendet, welche ich nun
als integer benutzen möchte. beispiel:

ascii zeichen "1" wird gesendet ==> umwandeln in integer

hab das ganze so gelöst:

uint_t test;
char speicher[7];

itoa(speicher[2],buffer,10);
lcd_puts(buffer);
hier nur mal um zu sehen was gesendet wurde z.B. 49 für die 1, 50 für
die 2, usw. das funktioniert soweit.


test=atoi(speicher[2]);
lcd_puts(test);
wenn ich nun das umwandle und wieder ausgebe kommt jedoch immer 0
herraus, was mach ich da falsch?

gruß
michael

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> test=atoi(speicher[2]);

Das ist nicht in Ordnung. atoi erwartet als Argument einen Pointer auf
char, nicht char.

Autor: Sven Kass (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht denn Deine lcd_puts aus?

Gruß
Sven

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm Rufus? Du hast dich wohl verlesen!

itoa(speicher[2],buffer,10);
lcd_puts(buffer);

buffer ist sein Pointer. Also das wo der String abgelegt wird. in
Speicher[2] steht sein Wert drinne, den er umwandeln will.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, ich habe mich nicht verlesen; es geht um atoi, nicht um itoa
(zumindest behauptet das der Titel des Thread).


  > hab das ganze so gelöst:
  >
  > uint_t test;
* > char speicher[7];
  >
  > itoa(speicher[2],buffer,10);
  > lcd_puts(buffer);
  >
  (...)
  >
* > test=atoi(speicher[2]);
  > lcd_puts(test);

(die mit * versehenen Zeilen sind die kritischen)

Natürlich geht lcd_puts mit einem anderen Parameter als einem Pointer
auf char auch in die Hose; 's wäre ja zu einfach, wenn Leute hier
ordentlich nur einen Fehler je Fragestellung machen würden :-)

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Recht, ich habe mich verlesen. Ach dieser ganze Kram mit integer
und ascii...

Ich wandle übrigens zahlen (!) zwischen ascii und int/char immer mit
+48 und -48 um

Autor: Michael Endres (michael76)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi rufus,

okay hab mich vielleicht unklar ausgedrückt.
es ging mir nur um die atoi routine, hab nun einfach das & vor
speicher gesetzt und dann ging´s. DANKE!

test=atoi(&speicher[2]);  // richtigs lösung


wieso ist diese zeile kritisch?

* > char speicher[7];

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.

  test=atoi(&speicher[2]);  // richtigs lösung

Das ist nur dann eine richtige Lösung, wenn im Array speicher irgendwo
hinter dem dritten Wert ein NUL-Zeichen ('\0') steht.

atoi erwartet einen Pointer auf einen nullterminierten String.

Wenn also speicher z.b. so gefüllt ist:

speicher[0] = 'x';  // uninteressant
speicher[1] = 'x';  // uninteressant
speicher[2] = '9';
speicher[3] = '0';
speicher[4] = '2';
speicher[5] = '3';
speicher[6] = '7';

dann geht die ganze Chose in die Hose. speicher[6] muss unbedingt mit
'\0' (resp. 0x00) initialisiert werden.

Auch solltest Du Dir dessen bewusst sein, daß atoi(&speicher[2]) in
diesem Falle eine ziemlich große Zahl zurückgibt, nämlich 9023 oder
eine mit einem 16-Bit-Int nicht darstellbare Zahl 90237... (ersteres,
wenn speicher[6] mit '\0' gefüllt ist, letzteres, wenn
zufälligerweise im Speicher hinter dem letzten Element des Arrays ein
NUL-Zeichen steht).


Übrigens kann man statt

  atoi(&speicher[2]);

auch

  atoi(speicher + 2);

schreiben. Damit wird vielleicht etwas deutlicher, daß atoi sich nicht
mit einzelnen Zeichen beschäftigt ...

Autor: Michael Endres (michael76)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi rufus,

danke nochmal für die erklärung, bin noch ein neuling mit der
programmierung und jetzt ist das mir schon etwas verständlicher.

danke!

gruß michael

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.