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

sprintf rozwala program!? [c][atmega32][winavr]

AVRowiec 25 Paź 2009 23:32 1649 3
REKLAMA
  • #1 7175645
    AVRowiec
    Poziom 18  
    Witam,

    Mam przedziwne wrażenie że instrukcja sprintf (jak i sscanf) potrafią porypać cały program, np go zawiesić albo sprawić że inne funkcje przestaną działać. Konwersja znaków jest jakimś strasznym obciążeniem dla kontrolera czy o co tu chodzi?
    Zauważyłem że im pamięć danych jest mniej zapchana tym rzadziej dochodzi do błędów. Najwidoczniej sprintf potrzebuje troche wolnej pamięci.. ale co jak co:

    sprintf(znak,"%d", n);

    żeby takie coś zawieszało program!?
    Jestem pewien że to te instrukcje, bo jak się je usunie to wszystko działa. Swego czasu pisałem własne konwersje ale np ta jest kłopotliwa. Zresztą po coś te print'y istnieją..
    Pomóżcie bo chyba sie załamie. Pisze gpsa i jestem już na etapie obsługi użytkowników, a przez to dziadostwo prosta funkcja sprawdzająca kto dzwoni za pierwszym podejściem przepuszcza a za kolejnym nie. O tym że od czasu do czasu cały procek się zawiesi nie wspomne..
    Pracuje na "pojemnym" uC i mam sporo zapasu pamięci. Wykorzystuje 25% pamięci kodu i ok 70% danych.

    Help :(
  • REKLAMA
  • #2 7175757
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 7175810
    zdebel
    Poziom 15  
    Ja bym się spytał, jaki typ ma u Ciebie 'znak'. Ja pisząc sobie mały pseudo-terminal na medze32 używałem sprintf gdzie popadnie i żadnych problemów z pamięcią nie było (tymniemniej, zawsze w okolicach 1KB ramu wolne) Podejrzewam, że skoro mówisz o konwersji, to znak to zwykły char, nie tablica, a sprintf o ile mnie pamięć nie myli, dorzuca \0 i w tym momencie robi Ci się fail. Proponuję zapoznać się z atoi itoa itp. tworami.
  • #4 7175943
    Freddie Chopin
    Specjalista - Mikrokontrolery
    zdebel napisał:
    Podejrzewam, że skoro mówisz o konwersji, to znak to zwykły char, nie tablica, a sprintf o ile mnie pamięć nie myli, dorzuca \0 i w tym momencie robi Ci się fail. Proponuję zapoznać się z atoi itoa itp. tworami.

    Żeby nie było wątpliwości, itoa() również wymaga tablicy i również dorzuca '\0'

    4\/3!!
REKLAMA