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

zwracanie łańcucha przez funkcje [WinAVR][AVR]

AVRowiec 04 Mar 2010 21:57 1593 7
REKLAMA
  • #1 7784691
    AVRowiec
    Poziom 18  
    Mam dziwny problem.
    Funkcja powinna zwrócić przetworzony łańcuch i wszystko jest ok póki nie podstawi się tego łańcucha w funkcji sprintf().
    Zobaczcie:
    char * numerPDUtoTXT(char * numer)
    {
       
      volatile char nowy[15];//  BEZ VOLATILE funkcja zwraca cały łańcuch - brak reakcji na nowy[strlen(numer)-1]=0; czyli zakończenie stringa
      char a=0;
      for (char z=0; z<15; z++) nowy[z]=0;// to nic nie daje
    
      for(a=0; a<strlen(numer) ; a+=2)
      {  
         nowy[a+1]=numer[a];
         nowy[a]=numer[a+1];
      } 
      
      nowy[strlen(numer)-1]=0;
     
              return (nowy);
    } 


    Wszystko działa póki nie wywołam tego w ten sposób:
    
    sprintf(buf,"ATD %s;",numerPDUtoTXT("11223344"));
    SendAT(buf);


    Jeśli dam:
    
    SendAT(numerPDUtoTXT("112233"));


    To wszystko działa.

    Krótko mówiąc: sprintf() nie może tego zmielić. Wypluwa jakieś krzaki albo nic.

    Ma ktoś pomysł?
  • REKLAMA
  • #2 7784728
    rpal
    Poziom 27  
    Nie będę kolego tego analizował od początku ale napiszę tylko tyle twoja funkcja zwraca wskaźnik do lokalnej tablicy danych. Zwróć uwagę że to co się w niej znajduje jest ważne tylko podczas trwania tej funkcji. Zwracając więc adres lokalnej zmiennej możesz po wyjściu z funkcji stracić te dane. Powinieneś sobie alokować więc pamięć aby dane stały sie nieulotne jednak pamiętając o tym żeby ten obszar potem zwolnić.
  • REKLAMA
  • #3 7784747
    AVRowiec
    Poziom 18  
    właśnie o tym sobie przypomniałem!
    usunąłbym ten temat ale już nie moge :(
    anyway dzięki :)
  • REKLAMA
  • #4 7784766
    rpal
    Poziom 27  
    No to masz pecha, bo pokłóciłem się ze starą i próbuję się czymś zająć aby opanować nerwy:)
  • #5 7784793
    AVRowiec
    Poziom 18  
    :)
    dałem static przed każdą deklaracją i działa.
    w alokowanie pamięci bawić mi się nie chce bo mam wrażenie że dynamiczne jej przydzielanie i ogólne zabawy ze wskaźnikami nie zawsze działają na AVR. mówię o przykładach prosto z książki nie moich własnych.. czasem sie cuda dzieją. no ale może sie myśle.
  • #6 7784811
    rpal
    Poziom 27  
    Generalnie to daję 95% że nic się z tym nie stanie czyli dane pozostaną na swoim miejscu. Sprawdź to sobie np. JTAG-iem jak masz ale pewności mieć nie będziesz że to będzie na pewno. A o tych wskaźnikach to smiem twierdzić że co nieco bredzisz :) bez urazy bo to żart.
  • REKLAMA
  • #7 7784874
    Freddie Chopin
    Specjalista - Mikrokontrolery
    AVRowiec napisał:
    ogólne zabawy ze wskaźnikami nie zawsze działają na AVR

    Ogólnie to na AVR nie zawsze działają programy napisane z błędami. Odrobina pokory, bo ten kod z pierwszego postu pokazuje, że raczej nie powinieneś rzucać sądów o tym "co na AVR nie działa"...

    4\/3!!
  • #8 7784990
    AVRowiec
    Poziom 18  
    jak pisałem "mam wrażenie" to miałem na myśli to że chyba coś jest nie tak. Praktycznie się tym tematem nie interesowałem ale dziwne jaja wychodziły czasem.
    Anyway wiem że jestem za głupi na jakiekolwiek osądy..
REKLAMA