logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[AVR][C]Czy coś mi się poplątało z itoa ?

mirekk36 17 Paź 2009 18:12 2727 2
REKLAMA
  • #1 7140445
    mirekk36
    Poziom 42  
    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:

    // 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
  • REKLAMA
  • Pomocny post
    #2 7141120
    tmf
    VIP Zasłużony dla elektroda
    Najpewniej masz za malo pamieci, itoa generuje string wspak i potem odwraca go za pomoca strrev. Wiec najwyrazniej wywolanie strrev sie nie powiodo. Inna mozliwosc to ciekawy blad w avr-libc.
  • #3 7141287
    mirekk36
    Poziom 42  
    no właśnie teraz na necie znalazłem trochę postów i to akurat przeważnie ludziska pisali o tym samym problemie też na ATtiny26 ... jednak nigdzie nie było jakby rozwiązania tegoż problemu poza wskazaniem także jak widzę na tę funkcję strrev lub na problemy ze stosem

    tak więc tak jak piszesz - widać ta funkcja strrev się nie wykonuje ale ciekawe że dalej działa to dobrze i nic się nie zawiesza
REKLAMA