passage d'une fonction comme argument pour une autre fonction (Résolu)

passage d'une fonction comme argument pour une autre fonction (Résolu) - C - Programmation

Marsh Posté le 07-03-2007 à 17:16:13    

Salut
Peut on passer une fonction en argument à une autre fonction ?
Si oui comment et c'est quoi l'utilité de le faire ?
 
merci

Message cité 1 fois
Message édité par big_dadi_fat le 08-03-2007 à 10:28:52
Reply

Marsh Posté le 07-03-2007 à 17:16:13   

Reply

Marsh Posté le 07-03-2007 à 17:49:52    

Avec un pointeur de fonction.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 07-03-2007 à 17:52:24    

skeye a écrit :

Avec un pointeur de fonction.


ça sert à quoi ?

Reply

Marsh Posté le 07-03-2007 à 17:53:33    

A passer une fonction à une autre fonction. [:dawao]

Reply

Marsh Posté le 07-03-2007 à 17:54:11    

Comme j'ai la flemme :
http://mapage.noos.fr/emdel/notes.htm#pointeurs

 

edit : et pour l'utilité, y en a plein : callback, "routage", etc.
Zieute la fonction qsort() de la libC pour un très bon exemple


Message édité par Elmoricq le 07-03-2007 à 17:56:05
Reply

Marsh Posté le 07-03-2007 à 17:57:53    

A passer une fonction en paramètre à une autre.[:dawa]
 
Genre une fonction de tri, tu passes en paramètre la fonction de comparaison à utiliser...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 07-03-2007 à 17:58:14    

[:benou_grilled]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 07-03-2007 à 18:02:58    

Mais on peut ce passer de l'utilisation des "pointeur sur fonctions" ou pas,
est ce que c'est aussi obligatoire (indispensable) que l'utilisation des pointeur sur variable dans certains cas ?

 

Message cité 1 fois
Message édité par big_dadi_fat le 07-03-2007 à 18:11:04
Reply

Marsh Posté le 07-03-2007 à 18:08:47    

C'est un outil. Il est plus ou moins adapté à une tache donnée, on peut parfois employer d'autres outils pour effectuer la même tache, et parfois non.

 

Sinon, oui, les pointeurs de fonctions sont parfois obligatoires.
Par exemple lorsque tu écris une bibliothèque avec des fonctions génériques (exemple : qsort).

 


edit : tiens, je me contredis [:petrus75] j'ai donc corrigé [:petrus75]

Message cité 1 fois
Message édité par Elmoricq le 07-03-2007 à 18:12:49
Reply

Marsh Posté le 07-03-2007 à 18:12:46    

Elmoricq a écrit :

C'est un outil. Un outil n'est jamais obligatoire, il est juste plus ou moins adapté à une tache donnée.


Ouais enfin en l'occurence en C les pointeurs de fonctions sont le seul moyen de passer une fonction en argument à une autre :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 07-03-2007 à 18:12:46   

Reply

Marsh Posté le 07-03-2007 à 18:13:38    

Argl quelqu'un m'a quoté. Va falloir que j'assume la connerie que je viens d'écrire. [:ken masters]

 

Donc oui, c'était pas génial ce que j'ai écrit. :o


Message édité par Elmoricq le 07-03-2007 à 18:13:45
Reply

Marsh Posté le 08-03-2007 à 09:27:32    

big_dadi_fat a écrit :

Peut on passer une fonction en argument à une autre fonction ?


Non, mais on peut passer l'adresse d'une fonction (son nom, en fait) via un pointeur de fonction. exemple en C standard : qsort(), bsearch(), signal(), atexit()...

Citation :

Si oui comment et c'est quoi l'utilité de le faire ?


A faire une action particulière, définie par l'utilisateur. Ca sert quand on ecrit du code générique (indépendant de l'application), pour personnaliser certaines actions qui dépendent de l'implémentation.
 
Pour qsort(), par exemple, on définie la manière dont est faite la comparaison, car qsort() ne sait absolument pas comment sont structurées les données des champs. Il ne connait des adresses et des tailles. Ca permet que 95% du code de tri soit 'pré-écrit' et que l'utilisateur n'ai plus à se concentrer que sur les 5% restants (l'écriture d'une fonction de comparaison en fonction de ses données à lui).
 
Cette technique sert aussi à implémenter la programmation par 'évènements'.
 
http://mapage.noos.fr/emdel/complog.htm
 
 
 


Message édité par Emmanuel Delahaye le 08-03-2007 à 09:40:27

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-03-2007 à 09:42:10    

big_dadi_fat a écrit :

Mais on peut ce passer de l'utilisation des "pointeur sur fonctions" ou pas,
est ce que c'est aussi obligatoire (indispensable) que l'utilisation des pointeur sur variable dans certains cas ?


C'est le seul moyen.

 

Rappel : on ne passe pas "la fonction", mais "l'adresse de la fonction". Pour passer une adresse, je ne connais que les pointeurs...

 

Message cité 1 fois
Message édité par Emmanuel Delahaye le 08-03-2007 à 09:43:16

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-03-2007 à 10:28:22    

Emmanuel Delahaye a écrit :


Rappel : on ne passe pas "la fonction", mais "l'adresse de la fonction". Pour passer une adresse, je ne connais que les pointeurs...


Ok merci.
 

Reply

Marsh Posté le 08-03-2007 à 10:33:39    

un truc que j'avais fait à l'arrache
 

Code :
  1. #include <iostream>
  2. #include <stdlib.h>
  3. using namespace std;
  4. int addition(int a, int b)
  5. {
  6.   return a+b ;
  7. }
  8. int produit(int a, int b)
  9. {
  10.   return a*b ;
  11. }   
  12. int opp(int a, int b, int (*f)(int, int))
  13. {
  14. return (*f)(a,b) ;
  15. }
  16. int main(int argc, char *argv[])
  17. {
  18.   int k = opp(4,7, addition) ;  // appel de la fonction passée en param
  19.   printf(":: %d\n", k) ;
  20.  
  21.   printf("------------------\n" ) ;
  22.  
  23.  
  24.   int ((*f)(int, int)) ;    // f: pointeur de fonction
  25.   f = addition ;            // affecfation
  26.  
  27.   int r = (*f)(1,4) ;       // appel de la fonction pointée
  28.   printf(":: %d\n", r) ;
  29.  
  30.   printf("------------------\n" ) ; 
  31.  
  32.   int ((*tabfun[10])(int, int)) ;   // tableau de pointeurs de fonctions
  33.  
  34.   for (int i=0 ; i<10 ; i++)
  35.   {
  36.     if (i%2) 
  37.         tabfun[i] = produit ;
  38.     else
  39.         tabfun[i] = addition ;
  40.   }
  41.  
  42.   int temp ;
  43.   for (int i=0 ; i<10 ; i++)
  44.   {
  45.      temp = tabfun[i](4,3) ;   // appel des fonctions pointées par le tableau
  46.      printf(":: %d\n", temp) ;
  47.   }
  48.  
  49.   system("PAUSE" );
  50.   return 0;
  51. }


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 08-03-2007 à 10:52:14    

jagstang a écrit :

un truc que j'avais fait à l'arrache

 
Code :
  1. #include <iostream>



Oué ! Tellement à l'arrache, que c'est même pas du C...


Project   : Forums
Compiler  : GNU GCC Compiler (called directly)
Directory : C:\dev\forums2\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: main.c
main.c:1:20: iostream: No such file or directory
main.c:4: error: syntax error before "namespace"
main.c:4: warning: type defaults to `int' in declaration of `std'
main.c:4: warning: data definition has no type or storage class
main.c: In function `main':
main.c:25: warning: implicit declaration of function `printf'
main.c:40: error: 'for' loop initial declaration used outside C99 mode
main.c:49: error: redefinition of 'i'
main.c:40: error: previous definition of 'i' was here
main.c:49: error: 'for' loop initial declaration used outside C99 mode
main.c: At top level:
main.c:22: warning: unused parameter 'argc'
main.c:22: warning: unused parameter 'argv'
Process terminated with status 1 (0 minutes, 2 seconds)
6 errors, 5 warnings


Youpi !

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int addition (int a, int b)
  4. {
  5.    return a + b;
  6. }
  7. int produit (int a, int b)
  8. {
  9.    return a * b;
  10. }
  11. int opp (int a, int b, int (*f) (int, int))
  12. {
  13.    return (*f) (a, b);
  14. }
  15. int main (void)
  16. {
  17.    {
  18.       int k = opp (4, 7, addition); // appel de la fonction passée en param
  19.       printf (":: %d\n", k);
  20.    }
  21.    printf ("------------------\n" );
  22.    int ((*f) (int, int));       // f: pointeur de fonction
  23.    f = addition;                // affecfation
  24.    {
  25.       int r = (*f) (1, 4);      // appel de la fonction pointée
  26.       printf (":: %d\n", r);
  27.    }
  28.    printf ("------------------\n" );
  29.    int ((*tabfun[10]) (int, int)); // tableau de pointeurs de fonctions
  30.    {
  31.       int i;
  32.       for (i = 0; i < 10; i++)
  33.       {
  34.          if (i % 2)
  35.             tabfun[i] = produit;
  36.          else
  37.             tabfun[i] = addition;
  38.       }
  39.    }
  40.    {
  41.       int i;
  42.       for (i = 0; i < 10; i++)
  43.       {
  44.          int temp = tabfun[i] (4, 3); // appel des fonctions pointées par le tableau
  45.          printf (":: %d\n", temp);
  46.       }
  47.    }
  48.    return 0;
  49. }

Message cité 1 fois
Message édité par Emmanuel Delahaye le 08-03-2007 à 10:58:46

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-03-2007 à 11:04:16    

Emmanuel Delahaye a écrit :

Oué ! Tellement à l'arrache, que c'est même pas du C...


J'ai précisé "à l'arrache". Coder en C n'est pas vraiment mon métier désolé [:jagstang]  


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 08-03-2007 à 11:26:12    

Ben dans ces cas-là, ne viens pas proposer d'exemple à un débutant en langage C si ton code est pourri. [:petrus75]

Reply

Marsh Posté le 08-03-2007 à 11:29:14    

Elmoricq a écrit :

Ben dans ces cas-là, ne viens pas proposer d'exemple à un débutant en langage C si ton code est pourri. [:petrus75]


ouais ouais.


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed