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

  FORUM HardWare.fr
  Programmation
  C++

  Portage de code de VC6 vers g++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Portage de code de VC6 vers g++

n°928558
peak
Posté le 20-12-2004 à 20:48:47  profilanswer
 

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.
 
 
 

mood
Publicité
Posté le 20-12-2004 à 20:48:47  profilanswer
 

n°928595
Taz
bisounours-codeur
Posté le 20-12-2004 à 21:41:16  profilanswer
 

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

n°928638
peak
Posté le 20-12-2004 à 22:33:24  profilanswer
 

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

n°928649
Taz
bisounours-codeur
Posté le 20-12-2004 à 22:42:10  profilanswer
 

oui. sauf le void main


Message édité par Taz le 20-12-2004 à 22:42:21
n°928667
peak
Posté le 20-12-2004 à 23:31:12  profilanswer
 

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.  
 
 
 

n°928682
Taz
bisounours-codeur
Posté le 20-12-2004 à 23:46:59  profilanswer
 

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

n°928734
peak
Posté le 21-12-2004 à 00:21:58  profilanswer
 

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:
 
 
 
 

n°928741
Taz
bisounours-codeur
Posté le 21-12-2004 à 00:26:43  profilanswer
 

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

n°928778
peak
Posté le 21-12-2004 à 02:01:20  profilanswer
 

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

n°928784
Taz
bisounours-codeur
Posté le 21-12-2004 à 02:09:19  profilanswer
 

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

mood
Publicité
Posté le 21-12-2004 à 02:09:19  profilanswer
 

n°928786
peak
Posté le 21-12-2004 à 02:28:58  profilanswer
 

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

n°928789
kadreg
profil: Utilisateur
Posté le 21-12-2004 à 07:04:49  profilanswer
 

le scope des boucles for :o


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°928790
Taz
bisounours-codeur
Posté le 21-12-2004 à 07:11:51  profilanswer
 

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

n°929004
peak
Posté le 21-12-2004 à 11:26:05  profilanswer
 

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
 
 

n°929010
Taz
bisounours-codeur
Posté le 21-12-2004 à 11:29:03  profilanswer
 

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

n°929029
peak
Posté le 21-12-2004 à 11:38:33  profilanswer
 

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

n°929692
peak
Posté le 22-12-2004 à 03:43:30  profilanswer
 

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.

n°951390
peak
Posté le 12-01-2005 à 03:33:39  profilanswer
 

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. :)

n°951395
docmaboul
Posté le 12-01-2005 à 07:48:49  profilanswer
 

Taz a écrit :

-Wold-style-cast


 
[:guitou54]

n°951396
Lam's
Profil: bas.
Posté le 12-01-2005 à 07:49:00  profilanswer
 

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

n°951524
peak
Posté le 12-01-2005 à 11:53:18  profilanswer
 

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:  

n°951527
Lam's
Profil: bas.
Posté le 12-01-2005 à 12:09:36  profilanswer
 

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
n°951536
peak
Posté le 12-01-2005 à 12:24:42  profilanswer
 

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:

n°951543
Lam's
Profil: bas.
Posté le 12-01-2005 à 12:34:20  profilanswer
 

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 :).

n°951554
peak
Posté le 12-01-2005 à 12:51:45  profilanswer
 

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?

n°951566
Lam's
Profil: bas.
Posté le 12-01-2005 à 12:59:43  profilanswer
 

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.
 

n°951578
peak
Posté le 12-01-2005 à 13:05:32  profilanswer
 

ok, j'ai rien dis  :D

n°952081
Profil sup​primé
Posté le 12-01-2005 à 23:32:02  answer
 

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 ?

n°952082
Taz
bisounours-codeur
Posté le 12-01-2005 à 23:35:40  profilanswer
 
n°952085
Profil sup​primé
Posté le 12-01-2005 à 23:48:20  answer
 

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

n°952090
Taz
bisounours-codeur
Posté le 12-01-2005 à 23:58:10  profilanswer
 

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.

mood
Publicité
Posté le   profilanswer
 


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

  Portage de code de VC6 vers g++

 

Sujets relatifs
Comment transférer une base MYSQL vers ACCESS ?gcc et code assembleur
lien vers un fichier sur le disque-ouverture du fichier en cliquantscript pour code source inaccessible
Timage utilisé en tant que lien vers un TwebrowserCode source d'un fichier PHP
yatil un nom pour les menus types mappy.fr ?je cherche un codeApplet Java : Redimensioner une image + upload vers FTP
Intégrer du code HTML dans du XML[Code C] Je recherche le code C pour récupéré le....
Plus de sujets relatifs à : Portage de code de VC6 vers g++


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