Witam,
wydawało mi się, że już nie raz używałem funkcji itoa. Ale teraz kompiluję akurat coś sobie na ATtiny26 i jakaś masakra mi się dzieje - tzn do bufora prawidłowo konwertowane są liczby tylko od 0 do 9
bo większe już układają się tak, że np gdy konwertuję zmienną o wartości 12 to w buforze najpierw mam cyfrę 2 a potem 1
jeśli zmienna ma np wartość -1732 to otrzymuję po odczytaniu z bufora
2371-
o co może chodzić ?
w robię to tak:
i wywołuję funkcję np tak:
no i na LCD mam właśnie: 3271-
a przecież wcześniej i na innych prockach zawsze mi to działało - co tym razem mogę robić źle ? Oczywiście funkcja lcd_str na 100% bierze znaki po kolei z bufora - więc wygląda jakby to itoa - wrzucało mi je teraz wspak
W tytule usunąłem ozdobniki - regulamin 11.2
[zumek]
Dodano po 2 [godziny]:
hmmm znalazłem wprawdzie powód tego dziwnego zachowania - ale nadal jakby nie wiem dlaczego w jednym przypadku to działa a w innym nie.
Otóż nie działa gdy funkcja wygląda tak:
ale jeśli zmienna bufor zostanie zadeklarowana nie wewnątrz funkcji tylko na zewnątrz to wtedy działa:
co może być powodem takiego zachowania ???? tzn wiem, że jeśli zmienna jest deklarowana wewn funkcji to tak na prawdę jest tworzona dynamicznie i na stosie a jeśli zdeklarują ją na zewnątrz to umieszczana jest ot tak w pamięci RAM. Wiadomo, że ten procek ma jej tylko 128 bajtów - no ale nic się nie krzaczy - tylko funkcja itoa umieszcza cyfry całej liczby wspak
wydawało mi się, że już nie raz używałem funkcji itoa. Ale teraz kompiluję akurat coś sobie na ATtiny26 i jakaś masakra mi się dzieje - tzn do bufora prawidłowo konwertowane są liczby tylko od 0 do 9
bo większe już układają się tak, że np gdy konwertuję zmienną o wartości 12 to w buforze najpierw mam cyfrę 2 a potem 1
jeśli zmienna ma np wartość -1732 to otrzymuję po odczytaniu z bufora
2371-
o co może chodzić ?
w robię to tak:
// funkcja wyświetla liczby dziesiętne na wyświetlaczu LCD
void lcd_int(int val, uint8_t radix)
{
char bufor[6];
lcd_str( itoa(val, bufor, radix) );
}i wywołuję funkcję np tak:
int a = -1723;
lcd_int(a, 10);no i na LCD mam właśnie: 3271-
a przecież wcześniej i na innych prockach zawsze mi to działało - co tym razem mogę robić źle ? Oczywiście funkcja lcd_str na 100% bierze znaki po kolei z bufora - więc wygląda jakby to itoa - wrzucało mi je teraz wspak
W tytule usunąłem ozdobniki - regulamin 11.2
[zumek]
Dodano po 2 [godziny]:
hmmm znalazłem wprawdzie powód tego dziwnego zachowania - ale nadal jakby nie wiem dlaczego w jednym przypadku to działa a w innym nie.
Otóż nie działa gdy funkcja wygląda tak:
// funkcja wyświetla liczby dziesiętne na wyświetlaczu LCD
void lcd_int(int val, uint8_t radix)
{
char bufor[6];
lcd_str( itoa(val, bufor, radix) );
}ale jeśli zmienna bufor zostanie zadeklarowana nie wewnątrz funkcji tylko na zewnątrz to wtedy działa:
char bufor[6];
// funkcja wyświetla liczby dziesiętne na wyświetlaczu LCD
void lcd_int(int val, uint8_t radix)
{
lcd_str( itoa(val, bufor, radix) );
}co może być powodem takiego zachowania ???? tzn wiem, że jeśli zmienna jest deklarowana wewn funkcji to tak na prawdę jest tworzona dynamicznie i na stosie a jeśli zdeklarują ją na zewnątrz to umieszczana jest ot tak w pamięci RAM. Wiadomo, że ten procek ma jej tylko 128 bajtów - no ale nic się nie krzaczy - tylko funkcja itoa umieszcza cyfry całej liczby wspak