829 votes

Comment faire passer une fonction en paramètre dans C?

Je veux créer une fonction qui effectue une fonction passée en paramètre sur un ensemble de données. Comment faire passer une fonction en paramètre dans C?

980voto

Niyaz Points 16307

Déclaration

Un prototype d'une fonction qui prend un paramètre de fonction se présente comme suit:

void func ( void (*f)(int) );

Cela indique que le paramètre f est un pointeur vers une fonction qui a un type de retour void et qui prend un seul paramètre de type int. La fonction suivante (en lettres moulées) est un exemple d'une fonction qui pourrait être transmis à la touche func comme un paramètre car il est du type approprié:

void print ( int x ) {
  cout << x << endl;
}

Appel De Fonction

Lors de l'appel d'une fonction avec un paramètre de la fonction, la valeur transmise doit être un pointeur sur une fonction. Utiliser le nom de la fonction (sans les parenthèses) pour cela:

func(print);

pourrait appeler la touche func, en passant à la fonction d'impression.

Corps De La Fonction

Comme avec n'importe quel paramètre, func pouvez maintenant utiliser le nom du paramètre dans le corps de la fonction pour accéder à la valeur du paramètre. Disons que func appliquera la fonction, il est transmis à l'un des numéros de 0 à 4. Considérons, en premier, ce que la boucle serait ressembler à l'appel d'imprimer directement à:

for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
  print(ctr);
}

Depuis func du paramètre déclaration dit que f est le nom d'un pointeur vers la fonction de votre choix, nous rappelons d'abord que si f est un pointeur alors *f est la chose la f des points (par exemple, la fonction d'impression dans ce cas). Comme un résultat, il suffit de remplacer chaque occurrence de l'imprimé dans la boucle ci-dessus avec *f:

void func ( void (*f)(int) ) {
  for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
    (*f)(ctr);
  }
}

À partir de http://math.hws.edu/bridgeman/courses/331/f05/handouts/c-c++-notes.html

164voto

roo Points 3294

Cette question a déjà la réponse pour la définition des pointeurs de fonction, cependant ils peuvent être assez complexes, surtout si vous allez les passer autour de votre application. Pour éviter ce désagrément, je vous recommande d'typedef le pointeur de fonction dans quelque chose de plus lisible. Par exemple.

typedef void (*functiontype)();

Déclare une fonction de type void et ne prend pas d'arguments. Pour créer un pointeur de fonction de ce type, vous pouvez le faire maintenant:

void dosomething() { }

functiontype func = &dosomething;
func();

Pour une fonction qui renvoie un int et qui prend un char que vous feriez

typedef int (*functiontype2)(char);

et pour l'utiliser

int dosomethingwithchar(char a) { return 1; }

functiontype2 func2 = &dosomethingwithchar
int result = func2('a');

Il y a des bibliothèques qui peuvent aider à transformer des pointeurs de fonction dans agréable lisible types. La fonction d'amplification de la bibliothèque est excellent et vaut bien l'effort!

boost::function<int (char a)> functiontype2;

est bien plus agréable que le précédent.

4voto

saint_groceon Points 2696

Vous avez besoin de passer un pointeur de fonction. La syntaxe est un peu encombrant, mais c'est vraiment puissant une fois que vous vous familiariser avec elle.

-2voto

Fahad Naeem Points 28

Pour passer d'une valeur à une fonction, vous devez déclarer tout d'abord. Pour cela, vous avez besoin de la syntaxe suivante :

Le type de retour de la fonction nom de la valeur (de passer)

La valeur inclus dans la parenthèse va à la fonction et vous pouvez effectué tout ce que vous voulez, comme vous l'avez déclaré, mais le garder à l'esprit que la valeur passée est stocké dans la valeur factice et les stocke dans la mémoire RAM à la place de la ROM et de la variable contenant, il ne sera pas le conserver une fois le programme est terminé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X