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

  FORUM HardWare.fr
  Programmation
  C

  [C] -pedantic et affectation entre pointeur de fonction et "void *"

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] -pedantic et affectation entre pointeur de fonction et "void *"

n°1030932
Deadog
Dain Bramaged
Posté le 31-03-2005 à 12:47:25  profilanswer
 

Salut :)
 
j'ai un ptit problème avec le "-pedantic" :o
j'essaye de n'avoir aucun warning à la compilation (histoire de faire propre ;)) mais la y'en a un qui me résiste :/
 
le code déjà :
il s'agit d'édition de liens dynamique, tout ce qu'il y a de plus banal en somme [:spamafote]
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dlfcn.h>
  4. int main(int argc, char **argv)
  5. {
  6.   //le pointeur vers la librairie(ou le module) chargee
  7.   void *handle = NULL;
  8.   //le pointeur vers la fonction coucou dans le module
  9.   //la déclaration doit être cohérente avec celle chargée dans le module
  10.   char *(*coucou)(void);
  11.   char *erreur = NULL;
  12.   if(argc == 1){
  13.     fprintf(stdout,"    Usage : %s [libcoucou1.so|libcoucou2.so]\n",argv[0]);
  14.     exit(0);
  15.   }
  16.   //on tente d'ouvrir la librairie demandee
  17.   handle = dlopen(argv[1], RTLD_LAZY);
  18.   //en cas d'echec...
  19.   if(handle == NULL){
  20.     fprintf(stderr,"%s\n",dlerror());
  21.     exit(1);
  22.   }
  23.   //on tente de resoudre le symbole coucou
  24.   //en d'autres termes on recherche la fonction coucou dans la lib ouverte
  25.   coucou = dlsym(handle,"coucou" );
  26.  
  27.   //en cas d'erreur...
  28.   if((erreur = dlerror()) != NULL){
  29.     fprintf(stderr,"%s\n",erreur);
  30.     exit(1);
  31.   }
  32.   //on appelle la fonction coucou offerte par la lib
  33.   printf("%s\n",(*coucou)());
  34.   //on referme la lib
  35.   dlclose(handle);
  36.   return 0;
  37. }


 
 
la compilation et son warning :

gcc -Wall -pedantic -std=c99 test.c -o test -ldl
test.c: In function `main':
test.c:30: attention : ISO C interdit affectation entre pointeur de fonction et « void * »


 
 
c'est donc le "coucou = dlsym(handle,"coucou" );" qui pose problème, et j'arrive pas à trouvé le castage ou l'astuce pour faire disparaître proprement ce warning :/
 
 
vous auriez une idée ?


Message édité par Deadog le 31-03-2005 à 12:48:24
mood
Publicité
Posté le 31-03-2005 à 12:47:25  profilanswer
 

n°1030940
Lam's
Profil: bas.
Posté le 31-03-2005 à 12:53:45  profilanswer
 

T'as le cul entre 2 chaises. Et encore, ça serait pire en C++ (le cul entre 3 chaises ?).
 
Regarde la partie "Rationale" là:
  http://www.opengroup.org/onlinepub [...] dlsym.html

n°1030956
Deadog
Dain Bramaged
Posté le 31-03-2005 à 13:06:23  profilanswer
 

merde :/
 
c'est d'autant plus génant que dans mon vrai code j'en ai un bon paquets des comme ça :/²
 
 
bah, euh, merci quand même ;)

n°1030988
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-03-2005 à 13:35:04  profilanswer
 

Deadog a écrit :

j'ai un ptit problème avec le "-pedantic" :o
j'essaye de n'avoir aucun warning à la compilation (histoire de faire propre ;)) mais la y'en a un qui me résiste :/

Code :
  1. void *dlsym(void *handle, char *symbol);
  2.   char *(*coucou)(void);
  3. <...>
  4.   coucou = dlsym(handle,"coucou" );


 
 
la compilation et son warning :

gcc -Wall -pedantic -std=c99 test.c -o test -ldl
test.c: In function `main':
test.c:30: attention : ISO C interdit affectation entre pointeur de fonction et « void * »


c'est donc le "coucou = dlsym(handle,"coucou" );" qui pose problème, et j'arrive pas à trouvé le castage ou l'astuce pour faire disparaître proprement ce warning :/


Le but de la bonne programmation n'est pas de 'faire disparaitre les warnings', mais plutôt de comprendre leur sens et d'agir en conséquence.  
 
Quel est le type retourné par dlsym () ? Après recherche, (fonction non standard), il semble que cette fonction retourne void *, ce qui n'est évidemment pas le bon type pour l'adresse d'une fonction. C'est pour ça que le compîlateur rale.  
 
En l'occurence, void * définit un type de pointeur générique sur un objet, mais qui n'est pas compatible (de façon portable) avec un pointeur de fonction.
 
http://mapage.noos.fr/emdel/notes.htm#pointeurs
 
Tu peux masquer le défaut de conception de dlsym() avec un horrible cast du type de la fonction, mais ça ne résout rien. Il n'y a malheureusement pas d'alternative, car le défaut vient de dlsym() et pas de ton code.
 
Je peux déjà affirmer que dlsym() ne peut fonctionner tel quel, que sur des architectures dont la taille des pointeurs sur objet et sur fonctions sont identiques (ce n'est pas le cas du X86 en mode réel avec modèle de mémoire medium ou compact) et où les registres pointeurs données et fonctions sont banalisés.


---------------
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°1031121
Deadog
Dain Bramaged
Posté le 31-03-2005 à 14:36:49  profilanswer
 

et bien, même en faisant :

Code :
  1. typedef char* (*coucou_t)(void);
  2. ...
  3. coucou_t coucou=NULL;
  4. ...
  5. coucou = (coucou_t) dlsym(handle,"coucou" );


 
y'a tjrs un warning (différent mais similaire)
 
 
pour la portabilité, hum, bah j'ai pas de solution alternative [:spamafote]


Message édité par Deadog le 31-03-2005 à 14:44:54
n°1031155
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-03-2005 à 14:51:08  profilanswer
 

Deadog a écrit :

et bien, même en faisant :

Code :
  1. typedef char* (*coucou_t)(void);
  2. ...
  3. coucou_t coucou=NULL;
  4. ...
  5. coucou = (coucou_t) dlsym(handle,"coucou" );


 
y'a tjrs un warning (différent mais similaire)


C'est normal et c'est plutôt c'est plutôt sain. Il n'y a pas de solution portable. Le Rationale est assez clair sur le sujet (fonction mal conçue...)


---------------
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/

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

  [C] -pedantic et affectation entre pointeur de fonction et "void *"

 

Sujets relatifs
Est-il possible de passer un paramètre à la fonction include ?Fixer un menu (probleme en fonction de la resolution)
convertir en maj avec la fonction touppervaleur de <input text> en fonction d'un <select>
Fonction 'atoi()" en Ada [RESOLU]Fonction à nombre paramètres variables
Fonction lancer au démarrage d'une application visual c++ .NETProtection par .htaccess ou par une fonction PHP?
appeler une fonction PHP suite à un clic ?[JSP] Fonction globale ?
Plus de sujets relatifs à : [C] -pedantic et affectation entre pointeur de fonction et "void *"


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