Portage de code de VC6 vers g++

Portage de code de VC6 vers g++ - C++ - Programmation

Marsh Posté le 20-12-2004 à 20:48:47    

Salut  :) ,
j'ai décidé de porter un de mes codes C++ (13.000lignes) qui compile sous VC6.0 vers g++ et me suis dis qu'un petit topique centralisant les problèmes pour lesquels je ne trouve pas de solutions me serais bien utile.
 
A la base j'utilisait g++ sous windows avec cygwin car j'avais des problèmes avec les librairies openGL (et glut) sous linux et de plus je n'ai jamais vraiment trouver de digne successeur d'un point de vu IDE à Visual Studio combiné à Visual Assist 6.0 sous linux (sans doute par habitude mais je n'ai pas testé eclipse; ce que je ferai dès que le portage sera terminé). J'ai vite pris la mauvaise habitude de compiler sous visual et me suis donc habitué à la dé-standardisation syntaxique propre à celui-ci.
 
Je ne connais pas bien les messages d'erreur de g++ et trouve certains particulièrement peu explicite....
 
Le gros est déjà plus ou moins passé mais là par exemple je ne comprend pas pourquoi ceci pose un problème :
 

Code :
  1. template<class Type>
  2. class test{
  3. };
  4. template<class Type>
  5. typedef void (test<Type>::*functor)(int);
  6. void main(){
  7. }


ERREUR :
template declaration of `typedef void (test<Type>::* functor)(int)'
 
Je trouve ce message d'erreur assez marrant d'ailleurs.
 
 
 

Reply

Marsh Posté le 20-12-2004 à 20:48:47   

Reply

Marsh Posté le 20-12-2004 à 21:41:16    

c'est normal, ce n'est pas du C++

Reply

Marsh Posté le 20-12-2004 à 22:33:24    

Ca risque d'être un peu plus compliqué que prevu  :sweat:
 
Considerez-vous que ce qui suit est du C++ ?

Code :
  1. class test{
  2. };
  3. typedef void (test::*functor)(int);
  4. void main(){
  5. }

Reply

Marsh Posté le 20-12-2004 à 22:42:10    

oui. sauf le void main


Message édité par Taz le 20-12-2004 à 22:42:21
Reply

Marsh Posté le 20-12-2004 à 23:31:12    

ok,
mais je comprends pas vraiment ce que ce message d'erreur m'apporte.
Disons que je peux sans doute en conclure que c'est une erreur sémantique sinon j'aurai un  "parse error befor ..." mais bon c'est pas génial comme moyen de déduction.... :D  
 
En gros je vois pas le problème.  
 
 
 

Reply

Marsh Posté le 20-12-2004 à 23:46:59    

et ben tu comprends qu'on ne peut pas faire un typedef template !

Reply

Marsh Posté le 21-12-2004 à 00:21:58    

Ok, je ne m'attendais pas à ce que ce soit si radical!
Merci, je m'en serais pas douté.  :jap:  
J'avais du mal à imaginer que ça pose un problème par ce que je considérais pas le typedef comme particulièrement évolué mais bon, je suppose qu'ils doivent avoir leurs raisons.
 
Ca va pas faciliter la résolution du "Internal compiler error." que j'ai sur cette ligne ci :

Code :
  1. template<class PosType, class ColorType, class VortexType>
  2. Liste<Stock<PosType, ColorType, VortexType>::Item<Point<PosType, ColorType> > *> * Vortex<PosType, ColorType, VortexType>::findPoint(const Point<VortexType, ColorType>& searched_point)


 
Mais j'ai encore de quoi méditer un peu sur cette erreur ci....
(http://gcc.gnu.org/bugs.html)
:bounce:
 
 
 
 

Reply

Marsh Posté le 21-12-2004 à 00:26:43    

le typedef, c'est pas gcc, c'est le standard qui le dit.
 
tu travailles avec quelle version ?

Reply

Marsh Posté le 21-12-2004 à 02:01:20    

j'ai installé DevC++ 4.9.7.0 avec gcc version 2.95.3-6 et g++-3.2.

Reply

Marsh Posté le 21-12-2004 à 02:09:19    

2.95 tu peux oublié. 3.2, c'est limite : assure toi au moins d'avoir la dernière version de la branche 3.2.
 
3.3.5 ou 3.4.3 sont chaudement recommandés

Reply

Marsh Posté le 21-12-2004 à 02:09:19   

Reply

Marsh Posté le 21-12-2004 à 02:28:58    

je vais commencer par me procurer une des dernières versions pour demain.
Merci pour tes conseilles Taz!

Reply

Marsh Posté le 21-12-2004 à 07:04:49    

le scope des boucles for :o


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 21-12-2004 à 07:11:51    

ouais. D'ailleurs, j'espère que tu utilises un flags un peu plus aggressif que -Wall

Reply

Marsh Posté le 21-12-2004 à 11:26:05    

kadreg a écrit :

le scope des boucles for :o

ouais mais ça j'avais prévu le coup. ;)
style j'utilise des noms de variables différents pour chaque initialiseur d'instruction for de même "profondeur" (i, j, k, l, m, n, o, p...). Je sais pas pourquoi mais j'ai toujours trouvé moche de déclarer l'initialiseur avant d'entrer dans le scope. :ange:  
 
 
Pour les options de compilations; ceci est il suffisamment agressif ?
-ansi -pedantic -Wall -W
 
 

Reply

Marsh Posté le 21-12-2004 à 11:29:03    

nan, c'est nul ça
g++ -W -Wall -std=c++98 -pedantic
 
 
+
 
-Weffc++
-Wold-style-cast
-Wshadow
-Winline

Reply

Marsh Posté le 21-12-2004 à 11:38:33    

ok, genial là j'ai de quoi m'occuper un peu!  :D
Je reviens se soir et corrigerai ça (+/- 200 warning).
 
:jap:

Reply

Marsh Posté le 22-12-2004 à 03:43:30    

Bon, ça prendra plus qu'un soir...
 
 
J'ai installé cywin et g++ 3.3.3.
J'ai 561warnings; bon evidement c'est pas 561 différents (170 warning: use of old-style cast, 92 `variable_name' should be initialized in the member initialization list, ...) c'est claire que ceux là vont allés vite mais bon c'est un peu exagéré quand même... :whistle:  
 
Fin comme quoi, j'aurai mieux fait de pas prendre de mauvaises habitudes.

Reply

Marsh Posté le 12-01-2005 à 03:33:39    

Une commotion cérébrale, une fracture du sinus, 2reveillons, une session d’examen et 560warnings plus tard …. Me revoilà.
 
Merci pour vos conseils ; je me suis juste « momentanément » passé des service de –Weffc++ par ce que vraiment certains warnings, je vois pas ce qui leur pose problème (dont certain dans la STL).
 
Par exemple :

/usr/include/c++/3.3.3/bits/stl_vector.h:78: warning: `class  
   std::_Vector_alloc_base<std::string, std::allocator<std::string>, true>' has  
   pointer data members
/usr/include/c++/3.3.3/bits/stl_vector.h:78: warning:   but does not override `
   std::_Vector_alloc_base<std::string, std::allocator<std::string>, true>
   (const std::_Vector_alloc_base<std::string, std::allocator<std::string>,  
   true>& )'


ou  

/usr/include/c++/3.3.3/bits/stl_iterator.h:580: warning: `class  
   __gnu_cxx::__normal_iterator<char*, std::basic_string<char,  
   std::char_traits<char>, std::allocator<char> > >' has pointer data members
/usr/include/c++/3.3.3/bits/stl_iterator.h:580: warning:   but does not  
   override `__gnu_cxx::__normal_iterator<char*, std::basic_string<char,  
   std::char_traits<char>, std::allocator<char> > >(const  
   __gnu_cxx::__normal_iterator<char*, std::basic_string<char,  
   std::char_traits<char>, std::allocator<char> > >& )'
/usr/include/c++/3.3.3/bits/stl_iterator.h:580: warning:   or `operator=(const  
   __gnu_cxx::__normal_iterator<char*, std::basic_string<char,  
   std::char_traits<char>, std::allocator<char> > >& )'


 
je n’ai pas non plus compris ce que ceci pouvais avoir de problèmatique :


warning: user-defined `AVL<Elem>& AVL<Elem>::operator||(const  
   AVL<Elem>& )' always evaluates both arguments


 
Sans -Weffc++, il m'en reste 1.
Ce qui pose problème c’est le passage de GLUT_BITMAP_8_BY_13 (void *)

API/window.hpp:349: warning: use of old-style cast
 
/*[349]*/
Window::printString(0.95, -0.95, RIGHT, BOTTOM, GLUT_BITMAP_8_BY_13, VIEW_NAME_FONT_WIDTH, VIEW_NAME_FONT_HEIGHT, stat_str, font_color);
 
/*prototype*/
static void printString(float, float, HorizontalAlign, VerticalAlign , void *, unsigned , unsigned , std::string , const Color& );

mais je ne vois pas comment arranger ça?
 
Appart ça le reste est passé sans problème.
Ca fait plaisir. :)

Reply

Marsh Posté le 12-01-2005 à 07:48:49    

Taz a écrit :

-Wold-style-cast


 
[:guitou54]

Reply

Marsh Posté le 12-01-2005 à 07:49:00    

Les warnings ont l'air d'être tirés des "common misuses" pointés par Scott Meyers dans "Effective C++" et "More Effective C++".
 
Ce sont de bons livres, tu peux l'acheter (si tu as le budget, bien sûr).  
http://www.amazon.com/exec/obidos/ [...] 9?v=glance
 
Sinon, il me semble qu'on trouve des PDFs ici ou là...
 
Quand au problème sur les Bitmap8_13, ça a l'air d'être lié à ça. Je te laisse lire, j'ai la flemme:
http://www.open-std.org/jtc1/sc22/ [...] e.html#195

Reply

Marsh Posté le 12-01-2005 à 11:53:18    

Pour le "Effective C++", je sais bien, c'est pour ça que je m'en suis passé. Ce que je ne comprennais pas c'est ce que cela pouvait avoir de dangereux et pourquoi cela méritait donc un warning?
Mais effectivement si j'achete le livre je serai fixé et suppose qu'ils ont leurs raisons....

Lam's a écrit :


Quand au problème sur les Bitmap8_13, ça a l'air d'être lié à ça. Je te laisse lire, j'ai la flemme:
http://www.open-std.org/jtc1/sc22/ [...] e.html#195


ok, merci pour le lien.
 :bounce:  

Reply

Marsh Posté le 12-01-2005 à 12:09:36    

Bah le premier warning dit que bien que la classe (vector)  contienne des pointeurs, elle n'a pas de copy-constructor, ce qui peut être dangereux (c'est vraiment un warning à la con, si tu veux mon avis, mais il est bien pour les débutants en C++).
 
C'est tiré de l'item 11 (chapitre 4 du livre)
 
"Declare a copy constructor and an assignment operator for classes with dynamically allocated memory."


Message édité par Lam's le 12-01-2005 à 12:11:01
Reply

Marsh Posté le 12-01-2005 à 12:24:42    

D'autant plus que la copie d'une référence à l'initialisation peut être interaissante dans certains cas.
Fin soit, il me semblais que c'était tous des warnings de ce style donc j'ai abandonné cette option de compilation.  :ange:

Reply

Marsh Posté le 12-01-2005 à 12:34:20    

peak a écrit :

D'autant plus que la copie d'une référence à l'initialisation peut être interaissante dans certains cas.
Fin soit, il me semblais que c'était tous des warnings de ce style donc j'ai abandonné cette option de compilation.  :ange:


 
C'est mon avis: laisse tomber cette option, par contre, essaie de lire le bouquin (fait le acheter par ta bibliothèque, etc.), ainsi que le More Effective C++. Ce sont de bons livres.
 
Par contre, un warning que je ne sais s'il faut que j'adore ou que je deteste, c'est le /W64 de Visual Studio, qui rale sur toute affectation entre un int et un pointeur. Pour l'instant il est désactivé (trop de legacy code non écrit par moi), mais je sens bien que je vais m'amuser lorsqu'il faudra le remettre :).

Reply

Marsh Posté le 12-01-2005 à 12:51:45    

ok, je vais suivre tes conseils et me procurer ce livre.
 
Pour le /W64 de Visual studio, l'utilisation d'un "reinterpret_cast" n'arrange-t-il pas le problème?

Reply

Marsh Posté le 12-01-2005 à 12:59:43    

peak a écrit :

ok, je vais suivre tes conseils et me procurer ce livre.
 
Pour le /W64 de Visual studio, l'utilisation d'un "reinterpret_cast" n'arrange-t-il pas le problème?


Nan.  
 

Code :
  1. const char * x = "Foo";
  2. int y = (int) x; // Le cast le plus puissant du monde, le C-Cast
  3. const char * z = (const char *) y;
  4. assert(x==z); // aucune garantie, je dirais même qu'il y a de fortes chances que ce soit faux.


Fondamentalement, le code ne fonctionne plus, puisque les pointeurs font 64 bits, et ne peuvent dont être représentés dans des int (qui eux restent à 32 bits sur la plupart des plate-formes). Il faut soit convertir en long, soit accepter de se ballader avec un (void *), soit revoir le code qui se permet de stocker des pointeurs dans des entiers, et ça, ça coute souvent cher.
 

Reply

Marsh Posté le 12-01-2005 à 13:05:32    

ok, j'ai rien dis  :D

Reply

Marsh Posté le 12-01-2005 à 23:32:02    

peak a écrit :

Ca risque d'être un peu plus compliqué que prevu  :sweat:
 
Considerez-vous que ce qui suit est du C++ ?

Code :
  1. class test{
  2. };
  3. typedef void (test::*functor)(int);
  4. void main(){
  5. }



 

Taz a écrit :

oui. sauf le void main


 
 
je comprends pas ce typedef
tu peux donner un exemple d'utilisation de ce nouveau type stp ?

Reply

Marsh Posté le 12-01-2005 à 23:35:40    

Reply

Marsh Posté le 12-01-2005 à 23:48:20    

ouais super c'est vachement evident qu'il faut rechercher a pointeur de fonction membre d'une classe

Reply

Marsh Posté le 12-01-2005 à 23:58:10    

ben tu cherches pointeurs, tu as déjà des réponses, tu tapes pointeur fonction, c'est le deuxième résultat ... faut pas pousser.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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