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 do funkcji jako parametr do funkcji

mirekk36 19 Gru 2009 21:39 12584 6
REKLAMA
  • #1 7411191
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    Witam,

    Korzystam czasem z przekazywania wskaźnika do funkcji, w postaci argumentu do innej funkcji mp:

    void fun(void)
    {
        //ciało funkcji
    }


    a następnie np tak:


    uint8_t get_kbd( uint8_t key, void (*fun)(void) )
    {
        if (key) 
        {
             fun;
             return 1;
        }
        else
        {
             return 0;
        }
    }
    
    int main(void)
    {
        uint8_t a = 0;
      
        a = get_kabd(5, fun);
        if (a) zrób_coś_tam;
        else zrób_coś_innego;
    
        return 0;
    }


    tak więc przekazanie wskaźnika do funkcji fun jako parametru do funkcji get_kbd oraz skorzystanie z jej dobrodziejstwa jest dla mnie nieocenione.

    JEDNAK ......

    .... czy można taką funkcję, która jest przekazywana przez wskaźnik jako argument do innej funkcji wywołać z jakimiś parametrami ??????????

    Jak próbuję w jakikolwiek sposób wstawić w jej deklaracji w miejscu argumentów zamiast void jakiś chociaż jeden argument no to już potem nie mogę jej przekazać jako wskaźnika - no i jakby lipa :(

    np tak:
    Cytat:
    a = get_kabd(5, fun(22));


    hmmm być może, albo może na pewno jest jakiś sposób zapisu tego - ale ja nie mogę dojść jakoś
  • REKLAMA
  • Pomocny post
    #2 7411302
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 7411426
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    albertb ----> oooo matko!!! :angel: to polałeś miód na moje uszy - przede wszystkim dlatego, że taka możliwość jest ;)

    czyli teraz rusza mi to tak ;)

    void fun(uint8_t z) 
    { 
        //ciało funkcji 
    }
    
    uint8_t get_kbd( uint8_t key, void (*fun)(uint8_t z), uint8_t az ) 
    { 
        if (key) 
        { 
             fun(az); 
             return 1; 
        } 
        else 
        { 
             return 0; 
        } 
    } 
    
    int main(void) 
    { 
        uint8_t a = 0; 
      
        a = get_kabd(5, fun, 19); 
        if (a) zrób_coś_tam; 
        else zrób_coś_innego; 
    
        return 0; 
    }


    czyli w funkcję get_kbd muszę poszerzyć możliwość przyjęcia dodatkowych parametrów w moim powyższym przypadku - parametr az

    ..... hmmmm ale w ogóle nie rozumiem twojego pytania:

    albertb napisał:

    Zastanów się z jakimi wartościami wywoła się

    get_kabd(5, fun(22))

    jeśli fun(22) to void?

    Albert


    a nie ukrywam, że BARDZO mnie intryguje o co tu chodzi???
  • REKLAMA
  • Pomocny post
    #4 7411511
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    fun(22) to nie jest wskaźnik do funkcji, tylko wywołanie funkcji fun z parametrem 22, a jako parametr wstawienie jej wyniku, który tutaj jest void, czyli bezsens.

    4\/3!!
  • REKLAMA
  • #5 7411543
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    Freddie Chopin napisał:
    fun(22) to nie jest wskaźnik do funkcji, tylko wywołanie funkcji fun z parametrem 22, a jako parametr wstawienie jej wyniku, który tutaj jest void, czyli bezsens.

    4\/3!!


    no tak - hmmm bo przecież dlatego właśnie się nie kompiluje takie coś nawet
  • Pomocny post
    #6 7415540
    ktrot
    Poziom 20  
    Posty: 166
    Pomógł: 47
    Ocena: 3
    Cytat:
    czyli w funkcję get_kbd muszę poszerzyć możliwość przyjęcia dodatkowych parametrów w moim powyższym przypadku - parametr az


    Można tak, można inaczej. Parametrami dla funkcji przekazywanej przez wskaźnik mogą być parametry aktualne funkcji wywołującej (jak w tym przypadku) lub np. zmienne lokalne czy globalne. Istotą tej konstrukcji jest wymienność samej funkcji a nie jej argumentów. Popatrz na bardzo podręcznikowy przykład sortowania tablicy:
    
    int tab[];
    
    char amb(int a, int b)
    {
      return(a<b);
    } 
    
    char awb(int a, int b)
    {
      return(a>b);
    }
    
    void sort(int *ptab,char  (*pf)(int x, int y))
    {
    int i,imax;
    //...
      if (pf(ptab[i],ptab[imax]))  //[...]
    //...
    }
    
    void main(void) 
    { 
    sort(tab,awb);
    //lub
    sort(tab,amb);
    }
    


    Pominąłem ciało funkcji sortującej ale widać o co chodzi. Wymieniając funkcję można sortować w porzadku malejącym lub rosnącym czy teź jeszcze inaczej. Trzeba tylko zachować liczbę i typ parametrów oraz typ zwracanego wyniku.
  • #7 7416600
    Dr.Vee
    VIP Zasłużony dla elektroda
    Posty: 1784
    Pomógł: 307
    Ocena: 76
    Do "zabawy" ze złożonymi typami polecam program cdecl, który jest interaktywnym translatorem typu "j. angielski" <-> "deklaracje ANSI C".

    Wersja online: http://www.cdecl.org/

    Pozdrawiam,
    Dr.Vee

Podsumowanie tematu

✨ W dyskusji poruszono temat przekazywania wskaźników do funkcji w języku C jako argumentów do innych funkcji. Użytkownik zadał pytanie o możliwość wywołania funkcji przekazywanej przez wskaźnik z parametrami. Odpowiedzi wskazują, że można to zrobić, rozszerzając deklarację funkcji, aby przyjmowała dodatkowe argumenty. Przykłady ilustrują, jak można przekazywać funkcje z parametrami oraz jak wykorzystać wskaźniki do funkcji w kontekście sortowania tablic. Podkreślono, że istotą jest wymienność funkcji, a nie jej argumentów.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA