Forum: Compiler & IDEs Warum verrechnen sich itoa, atoi und printf ?


von Otto Richter (Gast)


Lesenswert?

Hallo an alle,

ich sitze jetzt schon 3 Tage an einem Problem und bekomme es nicht
gelöst. Hier der Code:

uint32_t x = 25123 ;    // unsigned long int
uint8_t y [ 7 ] ;       // Zeichen-Array

itoa ( x, y, 10 ) ;     // einmal hin...
x = atoi ( y ) ;        // und wieder zurück

printf ("itoa - atoi %lu", x ) ;  // gibt Unsinn aus, wenn x>2^15

lcd_gotoxy (0, 0) ;
lcd_puts (y) ;                    // zeigt den gleiche Rechenfehler

Für x=0 bis 32768, also 2^15 funktioniert alles prima, von da ab,
kommen falsche Ergebnisse.

Sieht also aus, wie ein Vorzeichen-Problem, aber ich habe x als
unsigned definiert. Der Fehler tritt bereits bei itoa auf, wie das LCD
zeigt.

Was mache ich falch ?

Danke für  Euere Mühe

von Hagen R. (hagen)


Lesenswert?

öffne mal stdlib.h und da wirst du sehen

extern char *itoa(int __val, char *__s, int __radix);

extern char *ltoa(long int __val, char *__s, int __radix);

das zb. itoa() einen int als Parameter verlangt, also einen int16_t.
Naja, und gleich nach dessen Deklaration findest du auch die Lösung für
dein Problem.

Gruß Hagen

von Stefan (Gast)


Lesenswert?

Typischer Fall von Müll rein, Müll raus.

Die Funktion itoa() ist für ein signed int Argument programmiert, nicht
für unsigned int long. atoi() entsprechend.

von Wolfram (Gast)


Lesenswert?

>Was mache ich falsch?

Du hast die Deklaration der Funktion itoa nicht beachtet.
Sie erwartet einen signed int da kommst du auf der positiven Seite nur
bis 2^15.
nimm ltoa (long) dieser hat einen größeren Wertebereich oder noch
besser
ultoa (unsigned long)

von Otto Richter (Gast)


Lesenswert?

..hab verstanden !

Danke an alle, was wäre ich ohne dieses Forum !

Otto

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.