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

[AVR][C]Etykieta na końcu funkcji = błąd - dlaczego?

PO. 05 Lut 2009 00:37 4292 13
  • #1 6104569
    PO.
    Poziom 20  
    ../b1.c:441: error: label at end of compound statement

    Dostaję to przy kompilacji :( . Używam często etykiet (taki styl) i potrzebuję mieć na końcu procedury/funkcji jedną co AVR Studio uważa za błąd i generuje co widać powyżej. Co z tym zrobić - jak przekonać kompilator albo czym to zastąpić?
    Czy jest jakaś specyficzna instrukcja przerwania wykonywania funkcji do użycia zamiast goto?
    Czy wstawić jakiegoś nop'a, żeby się nie czepiał :) ? To trochę łatanie dziury by było.


    Pytanie pochodne - czy funkcja w c musi zwracać cokolwiek? Jeśli operuje na zmiennych globalnych i jest po prostu wykonywana (jako procedura - czy są jakieś różnice w deklaracji / wywoływaniu czy to "to samo" w c z punktu widzenia programisty?)?
    Ewentualnie co wstawić, żeby było prawomyślne? Coś w stylu:

    ? Czy to jest dopuszczalne?
  • #3 6104653
    dawid512
    Poziom 32  
    Cytat:
    czy funkcja w c musi zwracać cokolwiek?
    Nie musi :)
  • #4 6104662
    elektryk
    Poziom 42  
    Daj jakiś przykład kodu, może błąd polega na czymś innym.
  • Pomocny post
    #5 6104864
    Konto nie istnieje
    Konto nie istnieje  
  • #6 6106312
    PO.
    Poziom 20  
    albertb napisał:
    Bo tak ma być (i co zrobić ;-) ):

    http://gcc.gnu.org/ml/gcc-help/2004-04/msg00387.html

    A zamiast goto ewentualnie return rozważ.

    Albert


    Dzięki, widać ten typ tak ma... Tylko u mnie to nie był warning, którego bym przełknął ale error z którym nic nie mogę zrobić. Wstawiłem na końcu funkcji (przed etykietą) i za jednym zamachem załatwiłem tego errora i dodatkowego warninga że funkcja nic nie zwraca :) .
    To było dokładnie to, cytat błędu z kompilatora na górze.


    NIestety mam problem tego samego typu z main:

    Cytat:

    ../b1.c:1190: error: expected declaration or statement at end of input
    ../b1.c:1190: error: expected declaration or statement at end of input

    nie wiem czemu kompilator podaje błąd dwa razy... No i nie wiem czego chce, bo co prawda ostatnią instrukcją jest goto ale wykasowanie go nie zmienia błędu.


    Mam jeszcze warningi z typami zmiennych do wysłania na lcd ale to na osobny temat jak nie przewalczę...
  • #8 6106662
    PO.
    Poziom 20  
    Freddie Chopin napisał:
    jesli nie pokazesz calego kodu, to raczej nikt nie zgadnie...

    4\/3!!


    Poszło :) - głupi błąd, mianowicie brak zamknięcia dwóch bloków klamrami. Stąd też błąd wychodził dwa razy.
    Czy da się jakoś zmusić editors notepada (albo inny edytor) do kolorowania wcięć :) ? (na przykład zmieniania tła spacji w zależności od ich ilości, jak się robi tego więcej to się zlewa i można coś zgubić);

    Teraz kod i pytanie ostateczne, mianowicie po dodaniu "return;" zmienił się warning na:
    Cytat:
    ../b1.c: In function 'keycheck':
    ../b1.c:524: warning: 'return' with no value, in function returning non-void


    Olać to czy coś poprawiać? Kod poniżej, tym razem naprawdę potrzebny i jest go wystarczająco mało żeby podać ;) .

    keycheck() operuje na zmiennych globalnych i "zwraca" (tzn. zmienia) więcej niż jedną.

    
    int keycheck(void){
     
     for(int i=0;i<=15;i++){
      kl_poprz[i]=kl_bierz[i];
     }
    
     PORTC set1 b(0);
     if(PINC&b(4)) kl_bierz[1]=1;
     else kl_bierz[1]=0;
     if(PINC&b(5)) kl_bierz[4]=1;
     else kl_bierz[4]=0;
     if(PINC&b(6)) kl_bierz[7]=1;
     else kl_bierz[7]=0;
     if(PINC&b(7)) kl_bierz[11]=1;
     else kl_bierz[11]=0;
     PORTC set0 b(0);
     PORTC set1 b(1);
     if(PINC&b(4)) kl_bierz[2]=1;
     else kl_bierz[2]=0;
     if(PINC&b(5)) kl_bierz[5]=1;
     else kl_bierz[5]=0;
     if(PINC&b(6)) kl_bierz[8]=1;
     else kl_bierz[8]=0;
     if(PINC&b(7)) kl_bierz[0]=1;
     PORTC set0 b(1);
     PORTC set1 b(2);
     if(PINC&b(4)) kl_bierz[3]=1;
     else kl_bierz[3]=0;
     if(PINC&b(5)) kl_bierz[6]=1;
     else kl_bierz[6]=0;
     if(PINC&b(6)) kl_bierz[9]=1;
     else kl_bierz[9]=0;
     if(PINC&b(7)) kl_bierz[10]=1;
     else kl_bierz[10]=0;
     PORTC set0 b(2);
     PORTC set1 b(3);
     if(PINC&b(4)) kl_bierz[12]=1;
     else kl_bierz[12]=0;
     if(PINC&b(5)) kl_bierz[13]=1;
     else kl_bierz[13]=0;
     if(PINC&b(6)) kl_bierz[14]=1;
     else kl_bierz[14]=0;
     if(PINC&b(7)) kl_bierz[15]=1;
     else kl_bierz[15]=0; 
     PORTC set0 b(3);
     
     uint8_t i1=0;
     kl_o=0xFF;
     for(uint8_t i=13;i>=0;i--){
      kl[i]=0;  
      if ((kl_poprz[i]==1)&(kl_bierz[i]==0)){
       i1++;
       if (i1<2){
        kl_o=i;
    	kl[i]=1; }
       
      }
    
     }
    
     kl[14]=kl_bierz[14];
     kl[15]=kl_bierz[15];
    
     return;
    
    }
    
  • #9 6106740
    Freddie Chopin
    Specjalista - Mikrokontrolery
    ... no przeciez pisze co jest nie tak. funkcja ma zwracac inta, a nie zwraca nic. mylisz chyba to co funkcja modyfikuje wsrod zmiennych globalnych, z tym co ona zwraca. to sa dwie ODMIENNE rzeczy.

    jesli funkcja ma zwracac int, to na koncu ma byc return _zmienna_int_;

    zamiast spacji zwyklo sie uzywac tabulatorow. jak chcesz miec fajny edytor to zainstaluj eclipse.

    4\/3!!
  • #10 6106828
    PO.
    Poziom 20  
    Czyli zrobić z niej void?
  • Pomocny post
    #11 6106913
    xbaj
    Poziom 20  
    Jeśli nie chcesz nic zwracać tą funkcją, zmień z int keycheck(void) na void keycheck(void).
  • #12 6107122
    PO.
    Poziom 20  
    Poszło. A propos, czemu nie można zadeklarować main jako void?
  • #14 6107380
    PO.
    Poziom 20  
    Hmmm...
    Dzięki :) . Zaniedługo odezwę się w kolejnym temacie jak nie rozwiążę sam problemu tych zmiennych.

    BTW, zaczynałem ten program pisać w zwykłym notepadzie i też daje radę jak nie ma nic lepszego ;) .
REKLAMA