Forum: Mikrocontroller und Digitale Elektronik atoi problem


von Michael E. (michael76)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> test=atoi(speicher[2]);

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

von Sven Kass (Gast)


Lesenswert?

Wie sieht denn Deine lcd_puts aus?

Gruß
Sven

von Simon K. (simon) Benutzerseite


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.

von Rufus Τ. F. (rufus) Benutzerseite


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 :-)

von Simon K. (simon) Benutzerseite


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

von Michael E. (michael76)


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];

von Rufus Τ. F. (rufus) Benutzerseite


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 ...

von Michael E. (michael76)


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

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.