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

MFC Discussion :

erreur quand je veux remplir une CList :


Sujet :

MFC

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut erreur quand je veux remplir une CList :
    Voilà le principe :

    A la fin de InitInstance(), j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CDocument *pDoc=NULL;
    CMDIFrameWnd* pMDI=static_cast<CMDIFrameWnd*>(AfxGetMainWnd())->GetActiveFrame();
    if(pMDI) pDoc=pMDI->GetActiveDocument();
     
    	pDoc->ListCamera();
    	pDoc->GetConnectedCam();
    	delete pFrame;
    	delete pDoc;
    Sachant que j'ai déclaré ma liste de caméras dans CMyProjectDoc :
    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
     
    //dans MyProjectDoc.h :
    public:
       typedef CList <CCamera*, CCamera*> CCameraList;
        CCameraList m_CCameraList; //variable de type CCameraList;
       void ListCamera(void); //pour remplir la liste
     
    //dans MyProjectDoc.cpp :
    void CMyProjectDoc::ListCamera(void)
    {  	
       	CCamera1* pCamera1 = new CCamera1;
        m_CCameraList.AddHead(pCamera1); // C'est ici que se situe le problème
        CCamera2* pCamera2 = new CCamera2;
    	m_CCameraList.AddHead(pCamera2);
    }

    Voilà le problème maintenant :
    je suis le parcours du programme en mode debug :
    il commence par s'attaque à cette ligne CDocument *pDoc=NULL;
    il va donc dans document et rentre directement dans ListCamera() d'ailleurs, allez savoir pourquoi.
    Bref, il voit un pointeur et donc rentre dans CCamera1.
    Quand il revient, il doit donc s'attaquer à AddHead mais là, ASSERT FAILURE!



    Voilà sur quoi j'atteri (fichier afxtempl.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
     
    template<class TYPE, class ARG_TYPE>
    POSITION CList<TYPE, ARG_TYPE>::AddHead(ARG_TYPE newElement)
    {
    	ASSERT_VALID(this);
     
    	CNode* pNewNode = NewNode(NULL, m_pNodeHead);
    	pNewNode->data = newElement;
    	if (m_pNodeHead != NULL)
    		m_pNodeHead->pPrev = pNewNode;
    	else
    		m_pNodeTail = pNewNode;
    	m_pNodeHead = pNewNode;
    	return (POSITION) pNewNode;
    }

    Vous voyez le problème?

  2. #2
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void CMyProjectDoc::ListCamera(void) 
    {      
          CCamera1* pCamera1 = new CCamera1; 
        m_CCameraList.AddHead(pCamera1); // C'est ici que se situe le problème 
        CCamera2* pCamera2 = new CCamera2; 
       m_CCameraList.AddHead(pCamera2); 
    }
    pourquoi les classes CCamera1 et CCamera2 alors que la classe attendue est CCamera

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Ah ben mince alors, parce que ce que je croyais comprendre était faux:

    sur le principe général, la fonction GetConnectedCamera() que tu m'avais suggérée et qui balayait cette CListe pour en resortir un pointeur :
    je croyais comprendre que le pointeur délivré était du type de la classe héritée, c'est-à-dire de type CCamera1, CCamera2, etc.

    Je pensais qu'ensuite on appelait les fonctions de la classe ancêtre caméra par le pointeur récupéré (qui serait alors plus spécifiquement de type CCamera1*, CCamera2*, etc) ce qui permettait d'appeler les bonnes fonctions de la classe héritée reconnue.


    Bref, alors ma fonction de remplissage de la CList est fausse alors, mais je ne vois pas très bien du coup (encore une fois, c'est plus un problème de méthode que de code qui me bloque).

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    une precision tu as tout a fait le droit de faire une CList sur CCamera* et de stocker des pointeurs sur CCamera1* ou CCamera2 * si ces classes sont heritées de CCamera.
    si le programme plante sur la ligne ASSERT_VALID(this); c'est que l'objet qui stocke (la liste) n'est pas valide .
    que vaut l'adresse de this d'ailleurs ?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par farscape
    une precision tu as tout a fait le droit de faire une CList sur CCamera* et de stocker des pointeurs sur CCamera1* ou CCamera2 * si ces classes sont heritées de CCamera.
    Ah bon, je me disais bien quand-même; je suis pas fou!


    Citation Envoyé par farscape
    si le programme plante sur la ligne ASSERT_VALID(this); c'est que l'objet qui stocke (la liste) n'est pas valide .
    que vaut l'adresse de this d'ailleurs ?
    La flèche verte pointe juste sur la ligne du dessous donc je ne crois/sais pas que ce soit la ligne ASSERT_VALID(this) qui pose problème.
    this = 0x00000054 { CList<CCamera* , CCamera*> }

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    il y a de fortes chances quand meme que ce soit cette ligne ,
    regarde la pile des appels dans le debbuger sur quelle ligne il s'est arreté ? .
    apres il faut remonter l'appel pour voir d'ou ce fait l'insertion et si le contexte est valide ...

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Des précisions sur ce qui se passe :

    La fonction ci-dessous marche bien (cf vérif correctes : 2 adresses différentes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void CMyProjectDoc::ListCamera(void)
    {  	
        CCameraConnectee* pCameraConnectee = new CCameraConnectee;
        m_CCameraList.AddHead(pCameraConnectee);
        CCameraPipo* pCameraPipo = new CCameraPipo;
        m_CCameraList.AddHead(pCameraPipo);
     
        POSITION  pos1 =  m_CCameraList.GetTailPosition(); //pour vérif : 0x00c885ec
        POSITION  pos2 =  m_CCameraList.GetHeadPosition(); //pour vérif : 0x00c885f8
    }

    Là où ça coince, c'est ci-dessous : bizarrement quand on fait un GetTail il va chercher la bonne adresse mais le suivant il ne le connait plus!!
    Je précise que ma fonction IsConnected de ma classe pipo renvoie bien-sûr FALSE donc on ne devrait pas sortir de la boucle while.


    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
     
    CCamera* CMyProjectDoc::GetConnectedCam()
    {   
    	POSITION  pos =  m_CCameraList.GetTailPosition(); //OK 0x00c885ec
     
          while(pos)
          {
                CCamera* pCamera =  m_CCameraList.GetNext(pos); //là problème, ça passe à 0x00000000
     
                if( pCamera->IsConnected() ) 
                   return pCamera;
           }
     
           return NULL;
    }

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    Ben c’est normal non ?
    Gettail renvoie le dernier élément de la list récupérable par GetAt
    Getnext passe au suivant et récupère l’élément ,tu es a la fin c’est normal que ça renvoie zéro.

  10. #10
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    dans ce cas tu fais GetHeadPosition

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    J'en reviens pas d'être aussi bête...bon, y'a la fatigue mais là...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Plantage quand je veux ajouter une deuxième table
    Par jpclabaux dans le forum Débuter
    Réponses: 3
    Dernier message: 07/04/2012, 21h48
  2. [Oracle] erreur quand je veux ajouter un nouvel élément
    Par sarahG dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/04/2008, 16h48
  3. Réponses: 7
    Dernier message: 25/08/2006, 14h15
  4. Comment remplire une CList ?
    Par stof dans le forum MFC
    Réponses: 23
    Dernier message: 02/02/2005, 17h33

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