Bug g++

Bug g++ - C++ - Programmation

Marsh Posté le 05-11-2002 à 19:33:28    

C'est moi qui sait plus programmer, ou alors y'a vraiment un bug dans g++ ?
 

Code :
  1. #include <iostream.h>
  2. //Petite structure avec un int
  3. typedef struct{
  4.   int x;
  5. } myStruct;
  6. //Fonction qui prend 2 structures en paramètres, dont une CONST
  7. //Affiche les valeurs des structs (juste histoire de faire qqchose)
  8. void fct(myStruct* s1,const myStruct* s2){
  9.   cout << (s1->x)++ << ":" << s2->x << endl;
  10. }
  11. //Un template avec un pointeur de fonction statique :)
  12. template <class T> class myClass{
  13. public:
  14.   static void (*fct_ptr)(T,const T);
  15. };
  16. //On définit le pointeur de fonction du template pour le type myStruct
  17. void (*myClass<myStruct*>::fct_ptr)(myStruct*,const myStruct*)=(void (*)(myStruct*,const myStruct*))fct;
  18. // !!!! g++ a remplacé le proto du pointeur en (myStruct*,myStruct*) -> il a viré le CONST à la compilation
  19. int main(void){
  20.   return 0;
  21. }


 
:cry: help please ....


---------------
Avoir un arbre dans son jardin n'empêche en rien de se promener en forêt.
Reply

Marsh Posté le 05-11-2002 à 19:33:28   

Reply

Marsh Posté le 05-11-2002 à 20:38:13    

Commence deja par nous dire quelle version de g++ tu utilises.

Reply

Marsh Posté le 05-11-2002 à 20:46:07    

Kristoph a écrit a écrit :

Commence deja par nous dire quelle version de g++ tu utilises.




 
g essayé avec la 2.9.? et la 3.2 (derniere) : meme resultat


---------------
Avoir un arbre dans son jardin n'empêche en rien de se promener en forêt.
Reply

Marsh Posté le 05-11-2002 à 20:54:47    

au paasage, le compilateur de microsoft (vs6) deconne egalement : lorsqu'il instancie le template pour le type myStruct*, il replace le const myStruct* (2eme argument du pt de fonction) en myStruct* const, ce qui ne veut pas vraiment dire la meme chose


---------------
Avoir un arbre dans son jardin n'empêche en rien de se promener en forêt.
Reply

Marsh Posté le 05-11-2002 à 21:22:41    

Mon C++ est un peu rouillé sur cette partie, mais :
 

Code :
  1. const mystruct * p

, c'est bien le fait que p soit une constante, pointant sur un objet de type mystruct qui lui ne l'est pas ?

Reply

Marsh Posté le 05-11-2002 à 21:34:32    

c'est ca, contrairement à myStruct* const qui est un pointeur non constant vers une zone memoire qui est constante


---------------
Avoir un arbre dans son jardin n'empêche en rien de se promener en forêt.
Reply

Marsh Posté le 05-11-2002 à 21:42:46    

Bah dans ce cas, ce que tu demandes n'a aucun interet à faire ;)

Reply

Marsh Posté le 05-11-2002 à 21:51:08    

nan le pb c pas ca (compile le truc tu vas comprendre tout de suite)
 
ce que je veux faire c'est encapsuler une librairie purement C dans des jolies classes c++
myStruct et fct sont dans cette librairie, je ne peux pas y toucher (je les ai renommé et j'ai viré leur code pour que le pb soit compréhensible plus facilement)
 
le template fait partie de mon encapsulation, je peux donc y toucher
cependant il doit comporter un pointeur vers une fonction de la lib à encapsuler dont le proto est void (*)(T,const T)
 
cependant à la compilation, g++ transforme la declaration de ce pointeur en void (*)(T,T), ce qui fait que je ne peux pas le faire pointer vers la fonction fct dont le proto est void (*)(T,const T), d'où mon probleme re- :cry:


---------------
Avoir un arbre dans son jardin n'empêche en rien de se promener en forêt.
Reply

Marsh Posté le 05-11-2002 à 22:07:36    

Comme ca ca marche :
 

Code :
  1. #include <iostream.h>
  2.  
  3.   //Petite structure avec un int
  4.   typedef struct{
  5.       int x;
  6.   } myStruct;
  7.  
  8.  
  9.   //Fonction qui prend 2 structures en paramètres, dont une CONST
  10.   //Affiche les valeurs des structs (juste histoire de faire qqchose)
  11.   void fct(myStruct* s1,const myStruct* s2){
  12.       cout << (s1->x)++ << ":" << s2->x << endl;
  13.   }
  14.  
  15.   //Un template avec un pointeur de fonction statique :)
  16.   template <class T> class myClass{
  17.     public:
  18.       static void (*fct_ptr)(T*,const T*);
  19.   };
  20.  
  21.   //On définit le pointeur de fonction du template pour le type myStruct
  22.   void (*myClass<myStruct>::fct_ptr)(myStruct*,const myStruct*)=(void (*)(myStruct*,const myStruct*))fct;
  23.  
  24.   // !!!! g++ a remplacé le proto du pointeur en (myStruct*,myStruct*) -> il a viré le CONST à la compilation
  25.  
  26.   int main(void){
  27.    
  28.       return 0;
  29.   }

Reply

Marsh Posté le 05-11-2002 à 22:20:56    

merci bcp, tu es un dieu [:tuffgong] [:tuffgong]


---------------
Avoir un arbre dans son jardin n'empêche en rien de se promener en forêt.
Reply

Marsh Posté le 05-11-2002 à 22:20:56   

Reply

Marsh Posté le 06-11-2002 à 04:25:44    

Le cast m'a l'air non seulement inutile, mais en plus dangereux, car il forcera le compilateur à se taire s'il remarque une erreur.

Code :
  1. extern "C" typedef void fct_t(T*,const T*);
  2. fct_t* myClass<myStruct>::fct_ptr= fct;

Je pense que le 'extern "C"' est nécessaire, car un appel de fonction C ne suit pas les mêmes règles qu'en C++.
Le typedef devrait même être dans la classe:

Code :
  1. template <class T> class myClass{
  2. public:
  3. extern "C" typedef void fct_t(T*,const T*);
  4. static fct_t* fct_ptr;
  5. };
  6. myClass<myStruct>::fct_t* myClass<myStruct>::fct_ptr= fct;

Mais ça ne fait pas bon ménage avec le extern...
 
A noter qu'on peut faire des références de fonctions.
 

Kristoph a écrit a écrit :

Mon C++ est un peu rouillé sur cette partie, mais :

Code :
  1. const mystruct * p

, c'est bien le fait que p soit une constante, pointant sur un objet de type mystruct qui lui ne l'est pas ?


C'est l'inverse: pointeur variable, sur un mystruct considérée non modifiable.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Sujets relatifs:

Leave a Replay

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