Jak zdefiniować tablicę wskaźników funkcji w C

Mam małe pytanie. Próbuję dynamicznie zdefiniować tablicę wskaźników funkcji za pomocą calloc. Ale nie wiem jak napisać składnię. Wielkie dzięki.

Author: Unheilig, 2011-03-30

5 answers

Typ wskaźnika funkcji jest podobny do deklaracji funkcji, ale z "( * ) " w miejsce nazwy funkcji. Więc wskaźnik do:

int foo( int )

Byłoby:

int (*)( int )

Aby nazwać instancję tego typu, umieść nazwę wewnątrz ( * ), po gwieździe, tak:

int (*foo_ptr)( int )

Deklaruje zmienną o nazwie foo_ptr, która wskazuje na funkcję tego typu.

Tablice są zgodne z normalną składnią C umieszczania nawiasów w pobliżu identyfikatora zmiennej, więc:

int (*foo_ptr_array[2])( int )

Deklaruje zmienną o nazwie foo_ptr_array, która jest tablicą 2 wskaźników funkcji.

Składnia może być dość niechlujna, więc często łatwiej jest wprowadzić typedef do wskaźnika funkcji, a następnie zadeklarować tablicę tych znaków:

typedef int (*foo_ptr_t)( int );
foo_ptr_t foo_ptr_array[2];

W każdej próbce możesz zrobić takie rzeczy jak:

int f1( int );
int f2( int );
foo_ptr_array[0] = f1;
foo_ptr_array[1] = f2;
foo_ptr_array[0]( 1 );

Wreszcie, można dynamicznie przydzielić tablicę za pomocą jednego z:

int (**a1)( int ) = calloc( 2, sizeof( int (*)( int ) ) );
foo_ptr_t * a2 = calloc( 2, sizeof( foo_ptr_t ) );

Zwróć uwagę na dodatkowe * w pierwszej linii, aby zadeklarować a1 jako wskaźnik do funkcji pointer.

 102
Author: Andrew Eidsness,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-30 16:26:14

Umieszczam tutaj mały przykład, który może Ci pomóc

typedef void (*fp)(int); //Declares a type of a void function that accepts an int

void test(int i)
{
    printf("%d", i);
}

int _tmain(int argc, _TCHAR* argv[])
{
    fp function_array[10];  //declares the array

    function_array[0] = test;  //assings a function that implements that signature in the first position

    function_array[0](10); //call the cuntion passing 10

}
 5
Author: Andres,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-30 15:51:01

Można zadeklarować tablicę wskaźników funkcji jako

T (*afp[N])(); 

Dla pewnego typu T. Ponieważ dynamicznie przydzielasz tablicę, zrobisz coś w stylu

T (**pfp)() = calloc(num_elements, sizeof *pfp);

Lub

T (**pfp)() = malloc(num_elements * sizeof *pfp);

Następnie wywołasz każdą funkcję jako

T x = (*pfp[i])();

Lub

T x = pfp[i](); // pfp[i] is implicitly dereferenced

Jeśli chcesz być niekonwencjonalny, możesz zadeklarować wskaźnik do tablicy wskaźników do funkcji, a następnie przydzielić go w następujący sposób:

T (*(*pafp)[N])() = malloc(sizeof *pafp);

Chociaż trzeba by użyć wskaźnika tablicy przy tworzeniu wywołanie:

x = (*(*pafp)[i])();
 4
Author: John Bode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-30 17:03:06
typedef R (*fptr)(A1, A2... An);

Gdzie R jest typem zwracanym, A1, A2... An są typami argumentów.

fptr* arr = calloc(num_of_elements,sizeof(fptr));
 1
Author: Armen Tsirunyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-30 15:46:50

Zakładając, że wszystkie twoje funkcje są typu void ()(void), coś takiego

typedef void (*fxptr)(void);
fxptr *ptr; // pointer to function pointer
ptr = malloc(100 * sizeof *ptr);
if (ptr) {
    ptr[0] = fx0;
    ptr[1] = fx1;
    /* ... */
    ptr[99] = fx100;

    /* use "dynamic array" of function pointers */

    free(ptr);
}
 1
Author: pmg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-30 16:01:38