IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Propagation typedef -> plantage compilateur


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    System Integration Project Manager
    Inscrit en
    Octobre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : System Integration Project Manager
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 219
    Par défaut Propagation typedef -> plantage compilateur
    Bonjour,

    je ne sais pas si VS2005 n'aime pas l'arrivée de l'automne, mais j'ai plein de pbs avec lui en ce moment ...

    En voici un qui me surprend : j'ai défini une classe (CPointCloud) et je souhaite en cacher l'utilisation dans le composant de haut niveau.
    J'ai donc le "diagramme' d'utilisation" suivant.

    uses uses
    C3DSlicer --------> CPointCloudRenderingStrategy --------> CPointCloud

    J'ai "propagé" la définition des types internes :

    3DSlicer.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class C3DSlicer
    {
    typedef CPointCloudRenderingStrategy::eShape eShape;
    ......};
    PointCloudRenderingStrategy.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class CPointCloudRenderingStrategy
    {
    typedef CPointCloud::eShape eShape;
    ......};
    PointCloud.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    class CPointCloud
    {	
    public :
    	typedef struct SPointStruct
    	{		
    		typedef enum eShape
    		{
    			SQUARE=0,
    			CIRCLE,
    		};
     
    		CPoint3D	m_Pt;
    		COLORREF	m_PointColor;
    		eShape		m_PointShape;
    		CString		m_Text;
    	};
     
    	typedef SPointStruct::eShape eShape;
    ......};
    C'est peut être un peu capillotracté mais d'habitude, je n'ai pas de souci avec ce genre de déclaration/définition...


    Mais aujourd'hui, ca me plante le compilateur MSVC avec une erreur interne "C 1001" + erreur du compilateur d'optimisation alors que j'ai desactivé toutes les optimisations (mode DEBUG)
    .
    Je ne sais qu'en penser ! Est-ce la propagation de la definition des types est a proscrire ou pas conseillée (et pourquoi alors ...) et que faire a la place alors ?
    Ou est-ce un bug du compilo ?

    V

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Et sans le typedef devant struct SPointStruct ?

    MAT.

  3. #3
    Membre éclairé
    Profil pro
    System Integration Project Manager
    Inscrit en
    Octobre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : System Integration Project Manager
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 219
    Par défaut
    Bonjour,

    meme chose

    la seule parade que j'ai trouvé pour l'instant est de faire reference a l'enum de depart cad SPointStruct::eShape ...

    Meme la "propagation" suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class CPointCloud
    {
    public :
    struct SPointStruct
    	{		
    		typedef enum eShape
    		{
    			SQUARE=0,
    			CIRCLE,
    		};
     
    	......
    	};
     
    	typedef SPointStruct::eShape eShape;       <<---- CELLE-CI
    ...
    };
    fait planter le compilo alors que j'ai bien pîre dans d'autre partie du code !!

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par vdaanen Voir le message
    j'ai bien pîre dans d'autre partie du code !!
    C'est peut être là qu'il faut chercher...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    class CPointCloud
    {	
    public :
    	typedef struct SPointStruct
    	{		
    		typedef enum eShape
    		{
    			SQUARE=0,
    			CIRCLE,
    		};
          struct CPoint3D{};
          struct COLORREF {};
          struct CString {};
     
    		CPoint3D	m_Pt;
    		COLORREF	m_PointColor;
    		eShape		m_PointShape;
    		CString		m_Text;
    	};
     
    	typedef SPointStruct::eShape eShape;
    };
    class CPointCloudRenderingStrategy
    {
       public:
    typedef CPointCloud::eShape eShape;
    };
     
    class C3DSlicer
    {
    public:
    typedef CPointCloudRenderingStrategy::eShape eShape;
    };
     
     
    int main()
    {
       C3DSlicer::eShape e;
     return 0;
     
    }
    Compile très bien avec VC Express 2009 et VC 2005.

  5. #5
    Membre éclairé
    Profil pro
    System Integration Project Manager
    Inscrit en
    Octobre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : System Integration Project Manager
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 219
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    C'est peut être là qu'il faut chercher...
    Ce que je voulais dire, c'est que j'utilise bcp cette technique, notamment avec des classes génériques et c'est la premiere fois que je rencontre ce genre de comportement du compilo...

    Citation Envoyé par 3DArchi Voir le message
    Compile très bien avec VC Express 2009 et VC 2005.
    ben pas chez moi avec VC2005

    Est-ce que ca pourrait être dû a une saturation de "la mémoire des typedef" du compilateur ?

    Comment tester ? .....

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par vdaanen Voir le message
    Ce que je voulais dire, c'est que j'utilise bcp cette technique, notamment avec des classes génériques et c'est la premiere fois que je rencontre ce genre de comportement du compilo...


    ben pas chez moi avec VC2005

    Est-ce que ca pourrait être dû a une saturation de "la mémoire des typedef" du compilateur ?

    Comment tester ? .....
    Le code que je te proposes ne compile pas dans un projet tout nouveau tout beau ?

    Tu dis utiliser beaucoup de générique. Le problème peut être lié à cela. A ta place :
    1/ je commencerais par minimiser les includes dans tous les fichiers pour être sur de n'inclure que le strict nécessaire. L'historique fait qu'on se retrouve avec des includes qui ne servent plus à rien -> les chasser.
    2/ Mettre un maximum de déclaration à la place des includes de header dès que c'est possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // enlever :
    // #include "A.h"
    // pour :
    class A;
    // quand c'est possible (la présence uniquement sous forme de ref ou pointeur est un bon indicateur)
    3/ Eventuellement, réfléchir à mettre le plus de chose stable dans l'en-tête précompilé (d'ailleurs, voir ici pour les templates)
    4/ Après tout ceci, nettoyer la solution et faire un rebuild all.

Discussions similaires

  1. [langage]Compilateur PERL
    Par major2 dans le forum Langage
    Réponses: 4
    Dernier message: 07/02/2007, 21h52
  2. Compilateur - editeur C++ pour Linux
    Par Torpedox dans le forum Choisir un environnement de développement
    Réponses: 5
    Dernier message: 15/09/2002, 02h16
  3. Newbie......compilateur et table de caractères
    Par Cyberf dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 21/08/2002, 14h29
  4. Compilateur natif ??? Kesako ???
    Par Riko dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 06/08/2002, 08h54
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo