[Résolu] Passage d'une fonction en paramètre ?!?

Passage d'une fonction en paramètre ?!? [Résolu] - C - Programmation

Marsh Posté le 02-09-2003 à 14:47:22    

Bonjour,
Je suis tombé sur le bout de code suivant :
 

Code :
  1. int ProcessEdit(int CnxId,
  2.                 TListPtr CmdLineOpts,
  3.                 CharPtr  EditName,
  4.                 int (*ExecEdit) (int, char *, char *, char **),
  5.                 char ** DiagStr)
  6. {
  7. ...
  8. code_retour = ExecEdit(CnxId, SRVPath, StrFileName, DiagStr);
  9. ...
  10. }


On dirait qu'un fonction est passée en paramètre d'une autre fonction !
De plus, je ne trouve nulle par dans le projet la définition de la fonction ExecEdit(...).
 
Quelqu'un peut-il m'expliquer le mécanisme utilisé ci-dessus car je n'en ai jamais entendu parler :/
 
Merci !


Message édité par maestun le 02-09-2003 à 15:11:22
Reply

Marsh Posté le 02-09-2003 à 14:47:22   

Reply

Marsh Posté le 02-09-2003 à 14:49:23    

Ca s'appelle une fonction callback. Tu lui files une fct qu'il se charge d'appeler.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 02-09-2003 à 14:51:06    

HelloWorld a écrit :

Ca s'appelle une fonction callback. Tu lui files une fct qu'il se charge d'appeler.


Tu veux dire que la fonction ExecEdit est appellée en même temps que ProcessEdit (2 threads) ?

Reply

Marsh Posté le 02-09-2003 à 14:51:57    

Non, que ProcessEdit appelle ExecEdit...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 02-09-2003 à 14:53:28    

HelloWorld a écrit :

Non, que ProcessEdit appelle ExecEdit...


Dans ce cas, pourquoi passe-t-on ExecEdit en paramètre plutôt que de l'appeller uniquement dans le corps de l fonction ProcessEdit ? Quel est la différence ?

Reply

Marsh Posté le 02-09-2003 à 14:55:39    

HelloWorld a écrit :

Ca s'appelle une fonction callback. Tu lui files une fct qu'il se charge d'appeler.

ça c'est l'emploi. c'est tout simplement un pointeur de fonction
 
<type retour> (* nom_pointeur)([type arguments])

Code :
  1. size_t strlen(const char *);
  2. size_t (*length)(const char *);
  3. length = strlen;
  4. length = &strlen; /* équivalent */
  5. length("appel" );


Message édité par Taz le 02-09-2003 à 14:55:54
Reply

Marsh Posté le 02-09-2003 à 14:57:28    

C'est pas la fonction qui est passée en paramètre, mais un pointeur sur la fonction [:aloy]
 
edit: [:benou_grilled]


Message édité par Harkonnen le 02-09-2003 à 14:58:08

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-09-2003 à 15:03:38    

Autrement dit, si on a :
 
 

Code :
  1. int ProcessEdit(int CnxId, 
  2.                 TListPtr CmdLineOpts, 
  3.                 CharPtr  EditName,
  4.                 int (*ExecEdit) (int, char *, char *, char **),
  5.                 char ** DiagStr)
  6. {
  7.   ...
  8.   code_retour = ExecEdit(CnxId, SRVPath, StrFileName, DiagStr);
  9.   ...
  10. }
  11. ...
  12. ProcessEdit(CnxId, Options, Name, MaFonctionTest, &diagstr);


La fonction MaFonctionTest va être appellée dans le corps de ProcessEdit, c'est ça ?
L'intérêt serait donc de "moduler" le code de ProcessEdit dynamiquement selon l'appel ?

Reply

Marsh Posté le 02-09-2003 à 15:04:42    

Citation :

Dans ce cas, pourquoi passe-t-on ExecEdit en paramètre plutôt que de l'appeller uniquement dans le corps de l fonction ProcessEdit ? Quel est la différence ?


 
Je sais pas trop ce qu'est ton ProcessEdit, mais de faire ainsi ça te permet de choisir toi même le nom de la fonction et de lui filer ce que tu veux.
Exemple avec le quick sort :
http://www.opengroup.org/onlinepub [...] qsort.html
 
C'est une fonction de tri à qui tu files une fonction pour la comparaison des elements à trier.
Pour comparer des int tu peux filer une hypothétique CompareInt(), pour une struct à toi cmp(), ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 02-09-2003 à 15:07:58    

HelloWorld a écrit :


Je sais pas trop ce qu'est ton ProcessEdit, mais de faire ainsi ça te permet de choisir toi même le nom de la fonction et de lui filer ce que tu veux.


Je vois ce que tu veux dire...
Le pointeur sur fonction serait donc un "alias", qui permet de choisir le code à exécuter dans ProcessEdit en fonction de l'appel. M'enfin c'est ce qui me semble le + logique  ;)  
 
Merci à tous pour vos conseils, je me coucherai moins con ce soir !

Reply

Marsh Posté le 02-09-2003 à 15:07:58   

Reply

Marsh Posté le 02-09-2003 à 15:10:45    

remarque en C++: pour ceux qui utilise ce mécanisme en C++ plus tot que des références, la déférenciation du pointeur inhibe les directives inline. préférez donc les références, ou des objets fonctions.

Reply

Marsh Posté le 02-09-2003 à 15:13:42    

Taz a écrit :

remarque en C++: pour ceux qui utilise ce mécanisme en C++ plus tot que des références, la déférenciation du pointeur inhibe les directives inline. préférez donc les références, ou des objets fonctions.


Il me semble en effet que l'on peut éviter ce genre de mécanismes en C++ avec la notion d'objets. Mais le code que j'ai sous les yeux est en C pur et dur  [:trompette1]

Reply

Sujets relatifs:

Leave a Replay

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