Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
960 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1525428
big_dadi_f​at
Posté le 07-03-2007 à 17:16:13  profilanswer
 

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
mood
Publicité
Posté le 07-03-2007 à 17:16:13  profilanswer
 

n°1525450
skeye
Posté le 07-03-2007 à 17:49:52  profilanswer
 

Avec un pointeur de fonction.


---------------
Can't buy what I want because it's free -
n°1525453
big_dadi_f​at
Posté le 07-03-2007 à 17:52:24  profilanswer
 

skeye a écrit :

Avec un pointeur de fonction.


ça sert à quoi ?

n°1525454
Elmoricq
Modérateur
Posté le 07-03-2007 à 17:53:33  profilanswer
 

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

n°1525456
Elmoricq
Modérateur
Posté le 07-03-2007 à 17:54:11  profilanswer
 

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
n°1525457
skeye
Posté le 07-03-2007 à 17:57:53  profilanswer
 

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 -
n°1525458
skeye
Posté le 07-03-2007 à 17:58:14  profilanswer
 

[:benou_grilled]


---------------
Can't buy what I want because it's free -
n°1525459
big_dadi_f​at
Posté le 07-03-2007 à 18:02:58  profilanswer
 

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
n°1525463
Elmoricq
Modérateur
Posté le 07-03-2007 à 18:08:47  profilanswer
 

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
n°1525467
masklinn
í dag viðrar vel til loftárása
Posté le 07-03-2007 à 18:12:46  profilanswer
 

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
mood
Publicité
Posté le 07-03-2007 à 18:12:46  profilanswer
 

n°1525470
Elmoricq
Modérateur
Posté le 07-03-2007 à 18:13:38  profilanswer
 

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
n°1525668
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-03-2007 à 09:27:32  profilanswer
 

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/
n°1525677
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-03-2007 à 09:42:10  profilanswer
 

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/
n°1525699
big_dadi_f​at
Posté le 08-03-2007 à 10:28:22  profilanswer
 

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.
 

n°1525701
jagstang
Pa Capona ಠ_ಠ
Posté le 08-03-2007 à 10:33:39  profilanswer
 

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?  
n°1525719
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-03-2007 à 10:52:14  profilanswer
 

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/
n°1525727
jagstang
Pa Capona ಠ_ಠ
Posté le 08-03-2007 à 11:04:16  profilanswer
 

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?  
n°1525742
Elmoricq
Modérateur
Posté le 08-03-2007 à 11:26:12  profilanswer
 

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

n°1525745
jagstang
Pa Capona ಠ_ಠ
Posté le 08-03-2007 à 11:29:14  profilanswer
 

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?  

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
la fonction main[RESOLU] [SQL] Utilisation de champs dans un case CASE
[resolu][php/html] recevoir les info d'un formulaire par mail[JS] Exécuter une fonction à partir de son nom en variable chaîne
[Résolu] Envoi d'un mail en PHPpassage tableau à tableau avec boucle for
VBA access requete SQL et fonction()[résolu] array_unique() pour tableaux multidimensionnels
[résolu] Compter le nombre d'entrées de plusieurs tables[Résolu]Liste déroulante dynamique qui ne s'affiche pas
Plus de sujets relatifs à : passage d'une fonction comme argument pour une autre fonction (Résolu)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR