Comment passer une fonction comme paramètre en C?

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

493
demandé sur gsamaras 2008-08-13 06:16:32
la source

5 ответов

déclaration

un prototype pour une fonction qui prend un paramètre de fonction ressemble à ce qui suit:

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

indique que le paramètre f sera un pointeur vers une fonction qui a un type de retour void et qui prend un seul paramètre int . La fonction suivante ( print ) est un exemple d'une fonction qui pourrait être passé à func comme un paramètre parce que c'est le type approprié:

void print ( int x ) {
  printf("%d\n", x);
}

Appel De Fonction

Lorsqu'on appelle une fonction avec un paramètre de fonction, la valeur transmise doit être un pointeur vers une fonction. Utilisez le nom de la fonction (sans parenthèses) pour ceci:

func(print);

appellerait func , lui passant la fonction d'impression.

Corps De La Fonction

comme pour tout paramètre, func peut maintenant utiliser le nom du paramètre dans le corps de la fonction pour accéder à la valeur du paramètre. Disons que func va appliquer la fonction qu'il est passé aux nombres 0-4. Considérez, d'abord, ce que la boucle ressemblerait à appeler l'impression directement:

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

depuis la déclaration de paramètre de func dit que f est le nom d'un pointeur à la fonction désirée, nous rappelons d'abord que si f est un pointeur puis *f est la chose que f pointe à (c.-à-d. la fonction print dans ce cas). En conséquence, il suffit de remplacer chaque occurrence d'impression dans la boucle ci-dessus par *f :

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

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

619
répondu Niyaz 2015-11-24 04:59:51
la source

cette question a déjà la réponse pour définir les pointeurs de fonction, cependant ils peuvent devenir très désordonnés, surtout si vous allez les passer autour de votre application. Pour éviter ce désagrément, je vous recommande de taper le pointeur de fonction dans quelque chose de plus lisible. Exemple.

typedef void (*functiontype)();

déclare une fonction qui retourne nul et ne prend aucun argument. Pour créer un pointeur de fonction vers ce type vous pouvez maintenant faire:

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 de 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 les pointeurs de fonction en de beaux types lisibles. La boost fonction Bibliothèque est grande et vaut bien l'effort!

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

est tellement plus beau que ce qui précède.

106
répondu roo 2008-09-16 17:22:06
la source

depuis C++11, Vous pouvez utiliser la bibliothèque fonctionnelle pour le faire de façon succincte et générique. La syntaxe est, par exemple,

std::function<bool (int)>

bool est le type de retour d'une fonction à un seul argument dont le premier argument est de type int .

j'ai inclus un exemple de programme ci-dessous:

// g++ test.cpp --std=c++11
#include <functional>

double Combiner(double a, double b, std::function<double (double,double)> func){
  return func(a,b);
}

double Add(double a, double b){
  return a+b;
}

double Mult(double a, double b){
  return a*b;
}

int main(){
  Combiner(12,13,Add);
  Combiner(12,13,Mult);
}

parfois, cependant, il est plus commode d'utiliser une fonction de gabarit:

// g++ test.cpp --std=c++11

template<class T>
double Combiner(double a, double b, T func){
  return func(a,b);
}

double Add(double a, double b){
  return a+b;
}

double Mult(double a, double b){
  return a*b;
}

int main(){
  Combiner(12,13,Add);
  Combiner(12,13,Mult);
}
45
répondu Richard 2017-07-11 17:02:36
la source

passer adresse d'une fonction comme paramètre à une autre fonction comme indiqué ci-dessous

#include <stdio.h>

void print();
void execute(void());

int main()
{
    execute(print); // sends address of print
    return 0;
}

void print()
{
    printf("Hello!");
}

void execute(void f()) // receive address of print
{
    f();
}

aussi nous pouvons passer la fonction comme paramètre en utilisant indicateur de fonction

#include <stdio.h>

void print();
void execute(void (*f)());

int main()
{
    execute(&print); // sends address of print
    return 0;
}

void print()
{
    printf("Hello!");
}

void execute(void (*f)()) // receive address of print
{
    f();
}
9
répondu Yogeesh H T 2015-11-23 16:20:07
la source

vous devez passer un indicateur de fonction . La syntaxe est un peu lourde, mais elle est vraiment puissante une fois que vous vous familiarisez avec elle.

2
répondu saint_groceon 2008-08-13 06:18:28
la source

Autres questions sur pointers c syntax function parameters