Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[AVR][C] Menu wielopoziomowy z E.P. - dziwny bład kompilacji.

27 Maj 2012 16:23 2253 10
  • Poziom 8  
    Witam

    Próbuję właśnie zaadoptować kod menu wielopoziomowego z artykułu E.P. (Link) z procesora AT89S8252 na Atmega8. Jednak kompilator wyrzuca błąd, z którym nie umiem sobie poradzić.
    Wskaźniki wypunktowane w ostrzeżeniach wydają się działać poprawnie, jednak nie mam zielonego pojęcia o co chodzi w przypadku tego błędu w sekcji "main".
    Grzebałem już przy parametrze return i typie funkcji głównej, jednak bez rezultatu.


    Dopiero wyłączenie całej funkcji switch w f. Menu pozwala na dokończenie kompilacji, ale nawet wyłączenie zawartości case-ów nie pomaga.

    Proszę o podpowiedź jak to ruszyć dalej i ewentualnie co poradzić na te niekompatybilne wskaźniki.


    AVR Studio 4.14
    WinAVR-20100110

    Kod: c
    Zaloguj się, aby zobaczyć kod
    Code:
    Build started 27.5.2012 at 15:55:18
    
    avr-gcc.exe  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99  -DF_CPU=10000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT Menu.o -MF dep/Menu.o.d  -c  ../Menu.c
    ../Menu.c:26: warning: initialization from incompatible pointer type
    ../Menu.c: In function 'Clear_Marks':
    ../Menu.c:32: warning: assignment from incompatible pointer type
    ../Menu.c: In function 'Display_Menu':
    ../Menu.c:44: warning: assignment from incompatible pointer type
    ../Menu.c: In function 'Menu':
    ../Menu.c:99: warning: 'main' is normally a non-static function
    ../Menu.c:128: error: expected declaration or statement at end of input
    make: *** [Menu.o] Error 1
    Build failed with 1 errors and 4 warnings...
  • Poziom 27  
    Nie ma czegoś takiego:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ps. dla takiego maina jak masz ja nie dostaję błędu.
  • Poziom 8  
    @stanleysts
    Dzięki, rzeczywiście po zmianie na "menuitem *ptrmenus = menus" pierwsze ostrzeżenie zniknęło.
    Code:
    Menu.c:26: warning: initialization from incompatible pointer type 

    Pozostałe ostrzeżenia dotyczące znaczników, mimo iż niby wynikają z tego pierwszego pozostały.
    W oryginalnym listingu wyglądało to tak: menuitem code *ptrmenus = &menus
    Ale "code" chyba aktualnie nie jest wspierane.

    Czy używasz tej samej wersji WinAVR?
    Sprawdzałem na innym PC z tymi samymi wersjami programów i jest to samo.
  • Poziom 27  
    Nie działa Ci bo funkcja Menu() u Ciebie zwraca wartość tylko, jeśli jest w default. W case: też musisz coś zwrócić.

    A z tamtymi wskaźnikami to wiadomo, że masz warningi bo robisz to samo co w tej linijce, co Ci pokazałem (popraw 2 inne miejsca np tu:)

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 8  
    Tak, już doczytałem o wskaźnikach i ich powiązaniu z tablicami.

    Teraz walczę z tym errorem.
    W oryginale nie było sekcji default, a wyglądało to tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 27  
    Weź wrzuć cały oryginalny kod, a i jak coś wrzucasz to dawaj ten kod nad którym pracujesz a nie jakiś inny bo nie po to się traci czas na analizowanie, żebyś potem powiedział, że to nie ten jednak, że to inna wersja...
  • Pomocny post
    Poziom 27  
    No dobra nawet jeśli nie ma default to Twoja funkcja sobie w while coś do temp przypisuje a tam przecież czasem funkcja Menu nic nie zwróci, bo jak wejdzie w case1 lub case2 to co wtedy? Żeby się upewnić, czy jest to ten błąd to weź wstaw do tych case jakieś returny czegokolwiek i wtedy zobaczysz.
  • Poziom 38  
    stanleysts napisał:
    wstaw do tych case jakieś returny czegokolwiek i wtedy zobaczysz


    Można go dać poza switcha na sam koniec. Fajnie by było jakby autor sformatował ten kod. Uczy to dobrych nawyków, poza tym ciężko się to czyta i ciężko się pomaga :)
  • Poziom 8  
    @stanleysts
    Heh znalazłem błąd.
    O jeden nawias zamykający za mało funkcji w Menu :oops:
    A sprawdzałem na różnych edytorach żeby sprawdzić czy klamry są domknięte.
    Zorientowałem się dopiero przy odcinaniu (hashowaniu) kolejnych sekcji.

    Tak na szybko teraz sprawdzam, to menu się wyświetla, ale nie chce się ruszać.
    Zmienna actpos zmienia się prawidłowo (0-1).
    Ale to już chyba jutro będę rozkminiał.

    Dzięki za pomoc.


    Pozdro
  • Poziom 8  
    Witam po dłuższej nieobecności.
    Musiałem trochę odsapnąć od mikrokontrolerów, ale chciałbym wrócić w.w kodu.

    Udało się trochę ruszyć dalej, tzn. kursory już się przemieszczają, jednak nie wszystko działa tak jak trzeba. Konkretnie funkcja wypisująca listę (Display_Menu) nie wiedzieć czemu nie chce wypisać punktów powyżej menu1 i menu2.
    Dodałem do kodu "debuger", który wyświetla na LCD wartość aktualnej pozycji menu (actpos), ale za bardzo nie umiem dojść co jest nie tak.

    Co ciekawe jeżeli odblokuje się więcej niż 4 opcje menu czyli np. :
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Coś zaczyna się dziać, choć w dziwnej kolejności (actpos zachowuje się poprawnie).

    Może ktoś mógłby rzucić okiem?:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod