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

[atmega 32][c] struktura danych we flashu i wskazniki

domelfm 25 Paź 2011 03:49 1215 6
  • #1 10063152
    domelfm
    Poziom 16  
    Witam .

    Mam poważny problem i nie mogę sobie poradzić.
    Tak wygląda kodzik:



    Kod: text
    Zaloguj się, aby zobaczyć kod





    i teraz jak mam przejść do elementu dat_menu1[1] mając wskaźnik ptrm ??

    Takie odwołanie działa

    Kod: text
    Zaloguj się, aby zobaczyć kod


    A takie juz nie :
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Oczywiście jak korzystam z 1 rozwiązania to mogę wyłuskać nazwę z dat_menu1[1]

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Jezeli korzystam z drugiego rozwiazania to niestety juz nie dziala

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Ogólnie ma to działać tak ze będąc w menu 1 mam wskaźniki na meni znajdujące się wyżej, niżej , po prawej i po lewej .
    Wciskając klawisz up mam przejść z menu do menu wskazywanego wskaźnikiem (menu obecne).up , a (menu obecne) zmienić na te wskazywane przez (menu obecne).up .


    Kod: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #2 10063239
    michcior
    Poziom 30  
    &dat_menu1[0].down

    To jast wskaźnik na pole down, czyli wskaźnik na wskaźnik


    A to jest wartość tego wskaźnika.

    Może tak:
    ptrm=(menus (*))pgm_read_word(&ptrm->down);
  • #3 10063991
    domelfm
    Poziom 16  
    W tym szaleństwie jest metoda bo działa...

    Tylko trochę zakłóca moje rozumienie c.

    Bo skoro wartością wskaźnika jest adres komórki pamięci na która wskazuje, a my jeszcze raz wyłuskujemy adres operatorem & ...

    Ktoś może to wytłumaczyć ?


    Kulka chyba mnie oświeciło:)

    Po prostu ta ułomna funkcja (pgm_read_word) nie wie że ptrm to jest wskaźnik ????
  • Pomocny post
    #4 10064060
    michcior
    Poziom 30  
    Ta funkcja zwraca wartość ukrytą pod adresem który jest jej argumentem. Proste.

    Ponieważ w twoim przypadku, pod tym adresem kryje się wskaźnik, funkcja zwraca jego wartość czyli adres tego co ten wskaźnik wskazuje. O to chodzi w twoim kodzie bo rzutujesz to na inny wskaźnik potem.

    Wskaźnik na wskaźnik (**) to najfajniejsza rzecz w C (za wyjątkiem wskaźnika na wskaźnik na wskaźnik oczywiście). Trzeba odrobić pracę domową na początku bo potem braki dadzą się we znaki.
  • #5 10064285
    domelfm
    Poziom 16  
    OK to teraz jeszcze jedna sprawa :)

    Ktoś wie jak obejść problem z deklarowaniem w pamięci flash ??

    Kompilator wymaga inicjalizacji tego co wkładamy do flasha w momencie definiowania.

    A czy jest opcja najpierw zdefiniować a potem zainicjować ??

    Kod :

    Kod: text
    Zaloguj się, aby zobaczyć kod



    W kodzie zaznaczyłem błąd który wywala kompilator i ma racje :)
  • Pomocny post
    #6 10064440
    szelus
    Poziom 34  
    Najpierw zadeklaruj, aby kompilator wiedział co ma oznaczać symbol.
    Kod: text
    Zaloguj się, aby zobaczyć kod
REKLAMA