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

[AVR][C] - Wskaźnik na funkcję z parametrem, którym jest wskaźnik

superbzyku 04 Mar 2014 21:50 1707 12
REKLAMA
  • #1 13370473
    superbzyku
    Poziom 10  
    Posty: 74
    Ocena: 1
    Czołem,

    Od kilku dni stawiam pierwsze kroki z mikrokontrolerami AVR, stanąłem przed problemem z którym nie mogę sobie poradzić stąd moja prośba. Czy ktoś mógłby mi wytłumaczyć łopatologicznie taką kwestę?

    Piszę algorytm obsługi wielopoziomowego menu, wszystkie pozycje trzymam w takiej oto tablicy:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wszystko działa bez problemu natomiast chciałbym wpisać do tablicy wskaźnik na funkcję z parametrem, który jest wskaźnikiem do jakiejś zmiennej. Przykładowo zrobić jedną funkcje do zmiany wartości kilku zmiennych

    w taki sposób:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Gdzie pierwszy parametr funkcji to wskaźnik do mojej zmiennej, a kolejny to wartość maksymalna (nie istotne).

    Mój problem to w jaki sposób skonstruować typ danych, aby móc przekazywać parametry?

    struktura wygląda tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Oraz wywołać później żądaną funkcję, bez parametrów robię to tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Ale z parametrami nie mogę sobie poradzić, zrozumieć tego :( pomożecie? [/code]
  • REKLAMA
  • #2 13370534
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    A jaki to problem zdefiniować parametry?

    Po prostu wstaw je w te nawiasy i wsio.
  • #3 13370655
    superbzyku
    Poziom 10  
    Posty: 74
    Ocena: 1
    Mój problem polega na tym, że kiedy w strukturze zadeklaruję sobie tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i później próbuję się odwołać do zadeklarowanej funkcji (uruchomić ją) w ten sposób:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to mam błąd: error: expected expression before 'uint8_t'
  • REKLAMA
  • #4 13370667
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    superbzyku napisał:
    Mój problem polega na tym, że kiedy w strukturze zadeklaruję sobie tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i później próbuję się odwołać do zadeklarowanej funkcji (uruchomić ją) w ten sposób:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to mam błąd: error: expected expression before 'uint8_t'

    Od kiedy w ten sposób wywołuje się funkcje?
  • #5 13370692
    superbzyku
    Poziom 10  
    Posty: 74
    Ocena: 1
    Sam to wymyśliłem i przy funkcji bez parametrów działało :)
  • REKLAMA
  • #6 13370703
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Kombinujesz jak koń pod górę.

    Skoro chcesz przekazać coś funkcji to to zrób.
    Tak jak to się robi na "nie wskaźnikach".
  • REKLAMA
  • #7 13370737
    superbzyku
    Poziom 10  
    Posty: 74
    Ocena: 1
    Nie rozumiem, kiedy przekażę jej coś "na sztywno" tj

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to się kompiluje, ale ja potrzebuje odwołać się do parametru tej funkcji czyli "int parametr", a właściwie do wskaźnika, który zadeklarowałem tutaj:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 13370767
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Chcesz by parametrem był wskaźnik? Prosze:

    wskażnik:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    definiowanie struktury :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    nie jestem pewien czy znak wyłuskania jest konieczny
    wywołanie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jedna z funkcji:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 13370863
    superbzyku
    Poziom 10  
    Posty: 74
    Ocena: 1
    Czyli mogę np w ten sposób przekazać do funkcji parametr A z mojej tablicy?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Niby działa, ale mam ostrzeżenia przy kompilacji:

    "warning: passing argument 1 of 'menu[(int)menu_dziecko].f_start' makes pointer from integer without a cast"

    dla:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    oraz "initialization from incompatible pointer type"

    dla:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zdaje sobie sprawę, że to pew
  • #10 13370872
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Pewnie użycie wyłuskania pomoże oraz sprawdzenia poprawności typów.
  • #11 13370873
    superbzyku
    Poziom 10  
    Posty: 74
    Ocena: 1
    Stop! zrozumiałem :D

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    moim parametrem teraz nie jest wskaźnik a zwykła wartość czyli powinno być:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    tak mistrzu?

    * edytowałem, oczywiście bez gwiazdki...
  • Pomocny post
    #12 13370879
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    powinno być:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #13 13370884
    superbzyku
    Poziom 10  
    Posty: 74
    Ocena: 1
    no właśnie :)

    stokrotne dzięki, mogę iść spać w końcu :)

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem związany z używaniem wskaźników do funkcji w kontekście mikrokontrolerów AVR. Użytkownik próbował zdefiniować funkcję, która przyjmuje wskaźnik jako parametr, jednak napotkał błędy kompilacji. Uczestnicy forum zasugerowali poprawne podejście do definiowania wskaźników oraz wywoływania funkcji. Ostatecznie ustalono, że funkcja powinna być zdefiniowana jako `void (*f_start)(uint8_t *parametr)`, co pozwala na przekazywanie wskaźników do zmiennych. Użytkownik zrozumiał, że jego pierwotne podejście było błędne, a poprawne wywołanie funkcji powinno wyglądać jak `menu[menu_dziecko].f_start(&zmienna)`.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA