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

[atmega8] [atmega8][C] Błąd 'i' undeclared w pętli for - jak go naprawić?

Margroth 28 Lut 2013 17:39 1344 12
  • #1 11999077
    Margroth
    Poziom 11  
    Chce zaprogramować prosty układzik na atmega8 mający na celu różne konfiguracje świecenia diod po kliknięciu switcha, ale nie mogę sobie poradzić z dwoma błędami, a mianowicie są to błędy:
    `i` undeclared (first use in function)
    Each undeclared identifier is reported only once for each function it appears in
    w pogrubionej linijce w kodzie.
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Proszę o pomoc. Szukałem już w internecie podobnych sytuacja, ale każda z nich miała inne rozwiązanie, niepasujące do mojego przypadku. Jak widać i jest zdefiniowane i zainicjalizowane zerem w pętli. Później jest podobna sytuacja z petlą i z nią nie mam żadnych problemów, dlatego dziwią mnie te błędy.
  • #2 11999121
    johny_w
    Poziom 23  
    Zadeklaruj 'i' tak samo jak 'a', a nie w 'for'.
  • #3 11999221
    Margroth
    Poziom 11  
    Ale w for też powinno działać. Chce dowiedzieć się dlaczego tak nie jest, a nie co mam zrobić.
  • #4 11999274
    tmf
    VIP Zasłużony dla elektroda
    W klauzuli case nie można deklarować nowych zmiennych, aby to było możliwe należy umieścić dany fragment w bloku {...}.
  • #5 11999319
    Margroth
    Poziom 11  
    Ok, to dlaczego w "case 4" dało rade?

    I jeszcze jedno pytanko:
    Zrobiłem lekkie zmiany, w głównej pętli dałem taką instrukcję sprawdzającą czy switch jest wciśnięty(bo jeśli tak to zwiera do masy)

    Kod: text
    Zaloguj się, aby zobaczyć kod


    a jest zainicjalizowane zerem jak widać w poprzednim kodzie. Na początku wszystko jest jak ma być. Wykonywane jest instrukcja z "case 0". Po kliknięciu też wszystko jest ok i wykonywany jest kod pod "case 1", ale dalsze kliknięcia nic nie zmieniają, a powinny zmieniać wykonywane instrukcje i po 5-ciu kliknięciach znowu zmienna a powinna wynosić zero, a od drugiego kliknięcia nic się sie dzieje, a przecież instrukcja sprawdzająca jest w pętli głównej nieskończonej i nawet jak instrukcją case1 też jest pętla nieskończona to powinna ona być zmieniona na konstrukcję z innego "przypadku". Czy się mylę?

    Po wgraniu tego do avrka,
  • #6 11999676
    BlueDraco
    Specjalista - Mikrokontrolery
    Problem Kolegi wynika z tego, że pisze program w C++, a kompiluje go kompilatorem C. A to niestety dwa zupełnie różne języki, chociaż na pierwszy rzut niewprawnego oka wyglądają ciut podobnie.
  • #7 11999794
    Margroth
    Poziom 11  
    BlueDarco, ano możliwe, ponieważ teraz uczę się c++, ale różnicy nie dostrzegam w tym kodzie, bo c tylko musnąłem. Jakieś wskazówki oprócz tego, żeby zmienić rozszerzenie i użyć kompilatora c++? Tzn czym tym kod się różni od c++'a ? A już myślałem, że nawet takich podstaw nie potrafię ogarnąć :D
  • #8 11999881
    BlueDraco
    Specjalista - Mikrokontrolery
    W tradycyjnym C zmienne deklaruje się na początku bloku, czyli bezpośrednio po znaku {, przed instrukcjami. W C99 można deklarować prawie wszędzie, ale nie jestem pewny, czy wewnątrz for() też. Kompilatory dość niechętnie obsługują standard C99, np. Keil nie pozwala na deklaracje w dowolnym miejscu.
  • #9 12000012
    Margroth
    Poziom 11  
    Ok, ale to i tak nie wyjaśnia mojego problemu opisanego 4 posty wyżej :/. Po poprawnym skompilowaniu w c++ nie działa, zmieniałem też kod w c, tak że zmienne zadeklarowałem w blokach tak jak powiedziałeś i nadal nic.
  • #10 12000070
    BlueDraco
    Specjalista - Mikrokontrolery
    4 posty wyżej są 4 linijki wyrwane z programu. Pokaż cały program, to może coś będzie widać.
  • #11 12000155
    Margroth
    Poziom 11  
    Oto on:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #12 12000300
    BlueDraco
    Specjalista - Mikrokontrolery
    W programie stoi jak byk, że jeśli wejdziesz w case 1 lub case 2, to masz tam wisieć na wieki. Czyli program działa poprawnie nie wychodząc z case 1.
  • #13 12003943
    nproton
    Poziom 12  
    Pierwszy błąd, A nigdy nie będzie większe jak 1 ponieważ w pętli na początku za każdym razem inicjowane jest zerem:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Drugie 2 błędy, jak program wejdzie w case 1, case 2, case 3, lub case 4 pozostanie w nieskończonej pętli:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA