Programowanie w C – Przekazywanie funkcji jako argument funkcji

Wprowadzenie.

We wpisie przedstawiłem, w jaki sposób przekazać funkcję jako argument innej funkcji. Taka funkcjonalność może przydać nam się, gdy na przykład chcemy przeprowadzić testy naszej funkcji lub chcemy „obudować” funkcję dodatkową funkcjonalnością.

Zakres artykułu.

  • Przekazywanie funkcji jako argument funkcji
  • Przekazanie funkcji z parametrami jako argument funkcji

Przekazywanie funkcji jako argument funkcji

W pierwszym kroku napiszmy prostą funkcję, która wypisze nam wyraz „Hello”. 

void fun1(){
    printf("Hello");
}

Następnie należy stworzyć funkcję, która będzie posiadała parametr, do którego będziemy mogli przypisać jakąś funkcję.

Deklaracja takiej funkcji wygląda następująco.

void fun2(void (*f)());

W tym miejscu warto zwrócić uwagę, na to, że funkcje przekazuje się poprzez wskaźnik do funkcji. W naszym przypadku nasza funkcja jest typu void

Aby nie komplikować tego przypadku w definicji funkcji „fun2” napiszmy jedynie wywołanie przekazanej funkcji.

Definicja funkcji będzie wyglądała następująco.

void fun2(void (*f)()){
    f();
}

Jak możemy zauważyć, wywołanie przekazanej funkcji nie różni się od wywołania standardowej funkcji.

Stwórzmy teraz funkcję main(), w której wywołamy funkcję fun2() oraz przekażemy do niej jako argument funkcję fun1().

int main(){
    fun2(&fun1);
    return 0;
}

Cały kod programu wygląda następująco.

# include <stdio.h>

void fun1(){
    printf("Hello");
}

void fun2(void (*f)()){
    f();
}

int main(){
    fun2(&fun1);
    return 0;
}

natomiast wynik, jaki otrzymamy w konsoli, będzie następujący.

Hello

Przekazanie funkcji z parametrami jako argument funkcji

Teraz przedstawię, w jaki sposób przekazać funkcję z parametrami jako argument funkcji.

Podobnie jak wcześniej stwórzmy funkcję, która będzie dodawała dwie liczny typu int.

int dodawanie(int a, int b){
    return a + b;
}

Następnie stwórzmy funkcję, która będzie przyjmowała funkcję jako argument. Funkcja ta ma mieć za zadanie przetestowanie funkcji dodawanie. Dodatkowo nasza funkcja testująca niech informuje nas, czy test przeszedł, czy jest nie. 

Funkcja taka będzie wyglądała następująco. 

int test_funkcji_dodawanie(int (*f)(int, int), int a, int b, int c){
    if(f(a, b) == c){
        printf("PASS\n");
        return 1;
    }
    else{
        printf("FAIL\n");
        return 0;
    }
}

Cały kod programu wygląda następująco.

# include <stdio.h>

int dodawanie(int a, int b);
int test_funkcji_dodawanie(int (*f)(int, int), int a, int b, int c);

int main(){

    printf("wynik dodawania to: %d\n", dodawanie(3,4));
    test_funkcji_dodawanie(&dodawanie, 3, 4, 7); 
    test_funkcji_dodawanie(&dodawanie, 3, 4, 6);
    test_funkcji_dodawanie(&dodawanie, 3, 3, 6);
    test_funkcji_dodawanie(&dodawanie, 3, 1, 2);   

    return 0;
}

int dodawanie(int a, int b){
    return a + b;
}

int test_funkcji_dodawanie(int (*f)(int, int), int a, int b, int c){
    if(f(a, b) == c){
        printf("PASS\n");
        return 1;
    }
    else{
        printf("FAIL\n");
        return 0;
    }
}

natomiast wynik, jaki otrzymamy w konsoli, będzie następujący.

wynik dodawania to: 7
PASS
FAIL
PASS
FAIL

Dzięki zastosowaniu wyżej przedstawionej konstrukcji możemy w szybki sposób, przetestować jakąś funkcję z wieloma parametrami wejściowymi.

Autor artykułu
Dominik Bednarski

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *