Passage d'une fonction sans paramètre en paramètre d'une autre[résolu]

Passage d'une fonction sans paramètre en paramètre d'une autre[résolu] - C - Programmation

Marsh Posté le 12-04-2009 à 11:00:20    

Bonjour,
Je dispose d'une fonction de profil void quit(void) que j'appelle lors de la fermeture du programme, c'est à dire que je fais atexit(quit).
La fonction quit ne disposant pas de paramètres, je suis tenté d'écrire atexit(quit()) mais le compilateur n'accepte pas. Comment ça se fait ?
Inversement, ma fonction quit contient un appel à SDL_Quit(), or je ne peux pas dans ce cas simplement écrire SDL_Quit, sans les parenthèses. Je préfère écrire avec parenthèse mais c'était juste pour tester et je tombe sur un paradoxe.
 

Code :
  1. int main(int argc, char *argv[])
  2. {
  3.   (...)
  4.   atexit(quit); /*impossible de faire atexit(quit())
  5.    
  6.   (...)
  7.   return EXIT_SUCCESS;
  8. }


 

Code :
  1. void quit(void)
  2. {
  3.   SDL_Quit();   /*impossible de faire SDL_Quit */
  4. }


 
Lorsque je tente de faire atexit(quit()) j'obtiens cette erreur:
 

Code :
  1. make
  2. gcc -g -Wno-unused-parameter -Wall -ansi -pedantic `sdl-config --cflags --libs` -c src/init.c
  3. gcc -g -Wno-unused-parameter -Wall -ansi -pedantic `sdl-config --cflags --libs` -c src/input.c
  4. gcc -g -Wno-unused-parameter -Wall -ansi -pedantic `sdl-config --cflags --libs` -c src/main.c
  5. src/main.c: In function ‘main’:
  6. src/main.c:11: erreur: utilisation invalide d'expression void
  7. make: *** [main.o] Erreur 1


 
et lorsque je tente de faire SDL_Quit pour voir si c'est usuel de ne pas mettre de parenthèse s'il n'y a pas d'argument, j'obtiens :

Code :
  1. make
  2. gcc -g -Wno-unused-parameter -Wall -ansi -pedantic `sdl-config --cflags --libs` -c src/init.c
  3. src/init.c: In function ‘quit’:
  4. src/init.c:27: attention : déclaration sasn effet


 
 
Merci d'avance pour vos explications.


Message édité par atmakefka le 12-04-2009 à 13:09:35
Reply

Marsh Posté le 12-04-2009 à 11:00:20   

Reply

Marsh Posté le 12-04-2009 à 12:06:23    

1- atexit(quit); et non pas atexit(quit());
atexit attend comme paramètre l'adresse d'une fonction de prototype void func(void), comme l'indique son prototype: "int atexit(void (*func)(void));". Cette adresse est donnée directement en passant le nom de la fonction en paramètre (si p est un pointeur de fonction, faire p = func ou p = &func est équivalent en C. ici, p est le paramètre de atexit). Donc atexit(quit); est OK pour le compilateur.
Par contre, le type de retour de l'appel quit() est void et donc pas de type l'adresse d'une fonction de prototype void func(void), ce qui fait raler le compilateur si on fait atexit(quit());
2- SDL_Quit(); et non SDL_Quit;
En C, pour faire comprendre au compilateur qu'on fait un appel de fonction, il faut faire suivre le nom de la fonction par () [avec normalement les valeurs des parametres de la fonction à l'appel entre les ( et ), mais ici il n'y a pas de parametres, donc on se contente de ()].

 

Note: vous pourriez directement écrire atexit(SDL_Quit); si votre fonction quit est réduite au simple appel de SDL_Quit.

 

A+,


Message édité par gilou le 12-04-2009 à 12:09:02

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 12-04-2009 à 13:08:29    

D'accord, merci !
J'aurai du regarder le profil de atexit !

Reply

Sujets relatifs:

Leave a Replay

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