J'ai une petite question. J'essaie de définir un tableau de pointeurs de fonction dynamiquement avec calloc
. Mais je ne sais pas comment écrire la syntaxe. Merci beaucoup.
Le type d'un pointeur de fonction est identique à la déclaration de fonction, mais avec "(*)" à la place du nom de la fonction. Donc, un pointeur vers:
int foo( int )
serait:
int (*)( int )
Afin de nommer une instance de ce type, mettez le nom entre (*), après l'étoile, donc:
int (*foo_ptr)( int )
déclare une variable appelée foo_ptr qui pointe vers une fonction de ce type.
Les tableaux suivent la syntaxe C normale de placer les crochets près de l'identifiant de la variable, donc:
int (*foo_ptr_array[2])( int )
déclare une variable appelée foo_ptr_array qui est un tableau de 2 pointeurs de fonction.
La syntaxe peut devenir assez compliquée, il est donc souvent plus facile de créer un typedef vers le pointeur de fonction, puis de déclarer un tableau de ceux-ci à la place:
typedef int (*foo_ptr_t)( int );
foo_ptr_t foo_ptr_array[2];
Dans les deux exemples, vous pouvez faire des choses comme:
int f1( int );
int f2( int );
foo_ptr_array[0] = f1;
foo_ptr_array[1] = f2;
foo_ptr_array[0]( 1 );
Enfin, vous pouvez allouer dynamiquement un tableau avec l'un des éléments suivants:
int (**a1)( int ) = calloc( 2, sizeof( int (*)( int ) ) );
foo_ptr_t * a2 = calloc( 2, sizeof( foo_ptr_t ) );
Notez le supplément * dans la première ligne pour déclarer a1 comme pointeur vers le pointeur de fonction.
Je mets ici un petit exemple qui peut vous aider
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
}
Vous déclareriez un tableau de pointeurs de fonction comme
T (*afp[N])();
pour certains types T
. Puisque vous allouez dynamiquement le tableau, vous feriez quelque chose comme
T (**pfp)() = calloc(num_elements, sizeof *pfp);
ou
T (**pfp)() = malloc(num_elements * sizeof *pfp);
Vous appelez ensuite chaque fonction comme
T x = (*pfp[i])();
ou
T x = pfp[i](); // pfp[i] is implicitly dereferenced
Si vous voulez ne pas être orthodoxe, vous pouvez déclarer un pointeur vers un tableau de pointeurs vers des fonctions, puis l'allouer comme suit:
T (*(*pafp)[N])() = malloc(sizeof *pafp);
bien que vous deviez déférer le pointeur du tableau lors de l'appel:
x = (*(*pafp)[i])();
En supposant que toutes vos fonctions sont de type void ()(void)
, quelque chose comme ça
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);
}
typedef R (*fptr)(A1, A2... An);
où R est le type de retour, A1, A2 ... An sont les types d'argument.
fptr* arr = calloc(num_of_elements,sizeof(fptr));