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?
Réponses
Trop de publicités?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
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.
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.
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é.