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
> test=atoi(speicher[2]);
Das ist nicht in Ordnung. atoi erwartet als Argument einen Pointer auf
char, nicht char.
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.
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 :-)
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
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];
. 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 ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.