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

Deklaracja tablicy stringów w ANSI C dla mikrokontrolera - błąd kompilacji

autoservice 02 Gru 2007 20:34 3374 5
REKLAMA
  • #1 4544952
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    Witam
    Chciałbym zadeklarować tablicę stringów np.:
    flash unsigned char wybor[2][]={{"TAK"},{"NIE}};
    pisze to pod mikrokontroler.
    Są to tak jakby dwie tablice, chciałbym sie do nich odwolywac np:
    lcd_putsf=wybor[1][];
    czyli wypisze mi na wyswietlaczu TAK.
    Po prostu chce wyswietlic na wyswietlaczu TAK lub NIE w zaleznosci od od tego czy dana zmienna typu char przyjmie wartosc 1 lub 2. Wlasnie na podstawie liczby typu char chcialbym okreslic co ma byc wyswietlone...
    Ale niestety kompilator wywala mi blad "need array subscript" i nie wiem o co mu biega :(
    Pzdr.
  • REKLAMA
  • #2 4545195
    Wicked
    Poziom 18  
    Posty: 174
    Pomógł: 11
    Ocena: 6
    
    char* wybor[2] = {{"TAK"}, {"NIE"}};
    lcd_putsf = wybor[1];
    //przypadkiem nie powinno być lcd_putsf(wybor[1]);??
    

    Od dłuższego czasu nie używam ansi C i boję się czy nie popełniłem jakiejś herezji, ale ja bym to tak zrobił.

    Visual studio to przepuściło:), więc wydaje mi się, że u ciebie też powinno pójść.
  • REKLAMA
  • #3 4545281
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    ...Twoja wersja mi nie działa...z powodu "gwiazdki" ;)
    nastomiast działa mi takie coś...
    umieszczam dwie stałe w pamięci flash:

    flash char             tak[]="TAK ";
    flash char             nie[]="NIE "; 


    teraz deklaruję tablicę wskaźników (o dziwo też musi być we flash! ):
    flash char *wyborptr[2]={tak,nie};

    i teraz moge juz wyswietlac na LCD tak lub nie w zaleznosci od przyjmowanej wartosci przez zmienna i :
    lcd_putsf(wyborptr[i]);
    i o to mniej wiecej mi chodzi...ale chce jeszcze stworzyc funkcje w ktorej chce zmienia nie tylko zmienna i ale takze z ktorej tablicy wskaznikow ma sie odwolywac do stringow...
    pzdr.

    Dodano po 2 [godziny] 9 [minuty]:

    ...prosze o pomoc bo nie wiem jak to rozwiazac a mianowicie...
    mam zadeklarowane dwie stale tablice znakow:
    flash char tak[]="TAK";
    flash char nie[]="NIE ";
    
    zadeklarowana tablice wskaźników do tych stalych:
    flash char *wyborptr[2]={tak,nie};
    
    mam nastepne stringi we flashu:
    flash char jeden[]="JEDEN ";
    flash char   dwa[]="DWA";
    
    zadeklarowana 2 tablica wskaźników do tych stalych:
    flash char *liczbyptr[2]={jeden,dwa};


    i teraz chce stworzyc funkcje, w ktorej zmieniam zmienna "i" typu char...

    void zmiana_i(void)
    {
    unsigned char i; 
        
        while(1){
         ++i;
        };
    
    }


    to jest tylko przyklad, w funkcji tej w petli zmieniam wartosc i.
    Teraz chce wyprowadzic na LCD odpowiedni string z flash'a w zaleznosci od wartosci i (0 lub 1) ALE ! przy wywolywaniu funkcji chce miec mozliwosc wyboru z ktorej tablicy wskaznikow chce wybierac stringi ... i nie wiem jak to zrobic bo kompilator wywala mi blad ze nie moze zrobic wskaznika do wskaznika....
    czyli chcialbym cos takiego :
    void zmiana_i( /*tu wpisuje z ktorej tablicy ma wybierac stringi*/ )
    {
    
        while(1){
         unsigned char i; 
         lcd_putsf( /*odpowiednia tablica*/ [i]); //wypisz string na LCD
         ++i;
        };
    
    }
    

    czyli po wywolaniu

    zmiana_i(wyborptr);

    na LCD ma mi sie wyswietlac TAK lub NIE, w zaleznosci od wartosci i.
    a po wywolaniu funkcji

    zmiana_i(liczbaptr);

    chce na LCD JEDEN lub DWA...

    probowalem nawet stowrzyc druga tablice w ktorej elementem jest tablica wskaznikow...

    wie ktos jak to rozwiazac??
    Pzdr.

    Kod proszę umieszczać w znacznikach code - krzychoocpp
  • REKLAMA
  • #4 4546150
    Seba85
    Poziom 17  
    Posty: 110
    Pomógł: 24
    Jeżeli już koniecznie chcesz to zrobić na tablicach, to takie coś powinno zadziałać:

    void zmiana_i(flash char **tabptr )
    {
    unsigned char i = 0;
    while(1){
    lcd_putsf( tabptr[i]); //wypisz string na LCD
    i = (i + 1) % 2;
    };
    
    }


    A przy wywołaniu:
    zmiana_i((flash char**)wyborptr);


    Jeżeli przeszkadza ci rzutowanie możesz zadeklarować makro:

    #define MZMIANA_I(func) zmiana_i((flash char**)(func))


    Zmieniłem i++ na i = (i + 1)%2, bo przy pierwszej wersji czytałbyś spoza obszaru tablicy i by ci wyświetlało jakieś śmiecie, a tak ogranicza i do rozmiaru tablicy.

    Zastanawia mnie, czy ty gdzieś jeszcze wykorzystujesz tą tablicę, bo może lepszym rozwiązaniem byłoby nie robienie tablicy, tylko po prostu wrzucenie stałych do funkcji:

    #define WYBOR 0
    #define LICZBA 1
    
    void zmiana_i(int napis)
    {
    unsigned char i = 0;
    while(1)
    {
    if(napis == WYBOR)
    if(i == 0) lcd_putsf("TAK");
    else lcd_putsf("NIE");
    else if(napis == LICZBA)
    if(i == 0) lcd_putsf("JEDEN");
    else lcd_putsf("DWA");
    i = (i + 1) % 2;
    }


    Rozumiem, że to był tylko przykład, no bo jaki sens może mieć wywołanie takiej funkcji z nieskończoną pętlą?
  • REKLAMA
  • #5 4546237
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    ...wlasnie wrzucenie tych stringow do petli odpada poniewaz, mam kilka "kategorii" stringow ktore wybieram (np, menu, liczby tekstowo, dni tygodnia itp) i do kazdej kategorii musialbym tworzyc funkcje, a chce wlasnie stworzyc jedna uniwersalna...
    w funkcji mam petle bo tak mam napisana obsluge przyciskow...w petli
    pzdr.
  • #6 4547026
    Seba85
    Poziom 17  
    Posty: 110
    Pomógł: 24
    No dobra, ale przecież jak wywołasz tą funkcję, to ona nigdy się nie zakończy i zablokuje pozostały kod programu... Jesteś pewny że to Ci zadziała? Może pętla powinna być przed wywołaniem funkcji, a nie wewnątrz funkcji.

    Ps. Możesz też tak deklarować tą tablicę: wybor[][4] = {"TAK", "NIE"};
REKLAMA