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

  FORUM HardWare.fr
  Programmation
  C++

  Bug g++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Bug g++

n°240077
smax
Posté le 05-11-2002 à 19:33:28  profilanswer
 

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.
mood
Publicité
Posté le 05-11-2002 à 19:33:28  profilanswer
 

n°240087
Kristoph
Posté le 05-11-2002 à 20:38:13  profilanswer
 

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

n°240089
smax
Posté le 05-11-2002 à 20:46:07  profilanswer
 

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.
n°240090
smax
Posté le 05-11-2002 à 20:54:47  profilanswer
 

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.
n°240098
Kristoph
Posté le 05-11-2002 à 21:22:41  profilanswer
 

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 ?

n°240107
smax
Posté le 05-11-2002 à 21:34:32  profilanswer
 

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.
n°240110
Kristoph
Posté le 05-11-2002 à 21:42:46  profilanswer
 

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

n°240112
smax
Posté le 05-11-2002 à 21:51:08  profilanswer
 

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.
n°240121
Kristoph
Posté le 05-11-2002 à 22:07:36  profilanswer
 

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.   }

n°240137
smax
Posté le 05-11-2002 à 22:20:56  profilanswer
 

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.
mood
Publicité
Posté le 05-11-2002 à 22:20:56  profilanswer
 

n°240324
Musaran
Cerveaulté
Posté le 06-11-2002 à 04:25:44  profilanswer
 

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

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

  Bug g++

 

Sujets relatifs
[HTML, JS] Bug IE6 et background-color en CSS ?Bug des sessions sur le long terme [résolu] ?
[HTML] Bug étrange Dreamweaver MX<? header("location: index.php"); ?> CA BUG SVP AIDEZ MOI
VB5 + Windows 2000 = BUG...Bug ? ou j'ai du mal a ouvrir les yeux
[PHP] Champ qui n'affiche pas tout ( voir NEW BUG )Bug dans php 4.2.0 :??: :/ inexpliquable
Bug dans MySQL avec l'AUTO_INCREMENT et les index ?Bug Java très ralant (pour les utilisateur)
Plus de sujets relatifs à : Bug g++


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