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 :

Comment remplire une CList ?


Sujet :

MFC

  1. #1
    Membre éclairé
    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
    Par défaut Comment remplire une CList ?
    Pour remplir la liste, pour l'instant j'ai fait un truc ;

    Voilà, dans MyProject.h je déclare :
    typedef CList<CCamera*, CCamera*> CCameraList;

    et dans MyProject.cpp je crée la fonction suivante


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void CCamera::ListCamera(void)
    {     
       CCameraList m_camera;
     
        CCamera1* pCamera1 = new CCamera1;
        CCamera2* pCamera2= new CCamera2;  //etc...
     
       m_camera.AddHead(pCamera1);
       delete pCamera1;
       m_camera.AddHead(pCamera2);
       delete pCamera2;  //etc...
     
    }

    Au niveau syntaxe, c'est bon mais en tous cas on voit en mode debug que pos reste désespérément à 0x00000000 et donc on ne rentre jamais dans jamais la boucle while(pos) du code de GetConnectedCamera que voilà ci-dessous :

    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::GetConnectedCamera()
    {   
          POSITION  pos =  m_CCameraList.GetHeadPosition();
     
          while(pos)
          {
                CCamera* pCamera =  m_CCameraList.GetNext(pos);
                pCamera.Connect();
     
                if( pCamera.IsConnected() ) 
                     return pCamera;
           }
     
           return NULL;
    }

  2. #2
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 39
    Par défaut
    ta list ne contient pas des objets cameras mais juste des pointeurs sur des objets ,donc quand tu delete ton pointeur a l'exterieur de la liste tu affectes aussi celui que tu as ajoute a ta liste
    Autre chose j'ai remarque que dans l'ajout tu utlises m_camera comme membre et quand tu veux acceder a ta liste tu utilises m_CCameraList est ce normal???

  3. #3
    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
    Par défaut
    Citation Envoyé par Black_Daimond
    ta list ne contient pas des objets cameras mais juste des pointeurs sur des objets ,donc quand tu delete ton pointeur a l'exterieur de la liste tu affectes aussi celui que tu as ajoute a ta liste
    Autre chose j'ai remarque que dans l'ajout tu utlises m_camera comme membre et quand tu veux acceder a ta liste tu utilises m_CCameraList est ce normal???
    pas tout a fait , il detruit l'objet qu'il a stocker dans la list donc ça c'est mal ,
    mais la liste contient une adresse d'un objet detruit.
    la liste est vide pour les raisons indiquées par Black_Daimond.

  4. #4
    Membre éclairé
    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
    Par défaut
    Citation Envoyé par Black_Daimond
    quand tu delete ton pointeur a l'exterieur de la liste tu affectes aussi celui que tu as ajoute a ta liste
    OK, j'ai enlevé les delete pCamera1 et delete pCamera2


    Citation Envoyé par Black_Daimond
    Autre chose j'ai remarque que dans l'ajout tu utlises m_camera comme membre et quand tu veux acceder a ta liste tu utilises m_CCameraList est ce normal???
    Heu...non, c'est une connerie que j'ai rectifiée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void CCamera::ListCamera(void)
    {     
       CCameraList m_CCameraList;
     
        CCamera1* pCamera1 = new CCamera1;
        m_camera.AddHead(pCamera1);
     
        CCamera2* pCamera2= new CCamera2;  
        m_camera.AddHead(pCamera2); //etc...
     
    }

    Malheureusement, pos reste désespérément à 0x00000000

  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
    Par défaut
    tu es sur de travailler avec la meme variable ?
    tu te malange pas les pinceaux avec des objets declarés localement a la fonction (comme c'etait le cas dans ta fonction ListCamera) ?
    d'ailleurs emploi le prefixe m_ uniquement quand la variable est une donnée membre de ta classe ça prete a confusion.


  6. #6
    Membre éclairé
    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
    Par défaut
    Ca se voit ou pas que je comprend rien à ce que je fais... (enfin je rame) :


    Cette fois je suis sûr de l'avoir appelé pareil.

    En revanche, est-ce que faire dans la fonction GetConnectedCamera() :
    CCamera::CCameraList m_CCameraList;
    permet bien d'aller chercher la variable de type CCameraList que j'ai remplie dans Camera.cpp

  7. #7
    Membre éclairé
    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
    Par défaut
    Au fait, si j'écris ma ligne
    POSITION pos = m_CCameraList.GetTailPosition();
    dans ma fonction ListCamera, je vois que à cet endroit, j'ai bien une valeur pour pos.

    m_CCameraList s'est donc "perdue en cours de route" et quand je veux l'utiliser dans la fonction GetConnectedCamera de CMyProjectDoc, c'est foutu!

  8. #8
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 39
    Par défaut
    assures toi que tu ne detruits pas ta liste entre temps .
    sinon si c possible envoies le code de ta classe comme ca on pourra y jeter un coup d'oeil

  9. #9
    Membre éclairé
    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
    Par défaut
    Comment a-t-elle pu se détruire (j'ai rien demandé de la sorte moi évidemment).

    Lorsque j'effectue le debuggage pas à pas, le programme passe directement de la fonction ListCamera du fichier MyProject.cpp à la fonction GetConnectedCamera du fichier MyProjectDoc.cpp qui commence, je le rappelle par :

    CCamera::CCameraList m_CCameraList;
    POSITION pos = m_CCameraList.GetTailPosition();
    (***)

    Résumé très court : pos est connue à la fin de ListCamera [ce qu'on peut vérifier avec la ligne de code (***)] mais ne l'est plus quand on passe à GetConnectedCamera.




    Ces 2 fonctions sont appelées par InitInstance() :
    CCamera* pMyCamera = new CCamera;
    pMyCamera->ListCamera();
    CMyProjectDoc* pMyDoc = new CMyProjectDoc;
    pMyDoc->GetConnectedCam();
    delete pMyCamera;
    delete pMyDoc;

  10. #10
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 39
    Par défaut
    Citation Envoyé par stof
    CCamera* pMyCamera = new CCamera;
    pMyCamera->ListCamera();
    CMyProjectDoc* pMyDoc = new CMyProjectDoc;
    pMyDoc->GetConnectedCam();
    delete pMyCamera;
    delete pMyDoc;
    Je vois le probleme mnt

    GetConnectedCam() est membre d'un nouveau CMyProjectDoc donc sa list est different de celle que tu as crée par new CCamera
    c'est pour cela qu'elle est vide

  11. #11
    Membre éclairé
    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
    Par défaut
    Heum, oui certainement très cher... mais comment je fais alors?

  12. #12
    Membre confirmé
    Inscrit en
    Octobre 2002
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 39
    Par défaut
    je sais pa pourkoi tu crees un nouveau CMyProjectDoc
    mais si j'ai bien compris je te suggere de declarer dans la classe ou tu veux handler les methode de CCamera
    Comme ca tu as un seul objet CCamera tu peux en faire ce ke tu veux

  13. #13
    Membre éclairé
    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
    Par défaut
    Je ne suis pas sûr qu'on se comprenne très bien :

    Je ne crée pas une nouvelle classe xxxxxxDoc, celle dont je parle est celle qui est créée pour un projet MultiDocument (MDI).

    Si ce que tu veux dire par "nouveau document", c'est quand tu fais allusion aux lignes :
    CMyProjectDoc* pMyDoc = new CMyProjectDoc;
    pMyDoc->GetConnectedCam();


    j'ai pas d'autre solution pour aller chercher une fonction située dans CMyProjectDoc à partir de CMyProjectApp

  14. #14
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Tu peux obtenir le document à partir du membre m_pMainWnd de l'objet Application

  15. #15
    Membre éclairé
    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
    Par défaut
    Citation Envoyé par Gabrielly
    Tu peux obtenir le document à partir du membre m_pMainWnd de l'objet Application
    Ah, content de te revoir; c'est que je lutte un peu pour appliquer tes conseils de Vendredi. Du coup j'essaie d'arranger ça et en parallèle j'avance sur une ancienne version (mal programmée).

    Bon alors je viens de regarder ce qu'on peut obtenir avec m_pMainWnd : plein de trucs mais j'ai pas vu la méthode pour le document (pas de GetDocument comme on a dans View).

    Bref, le truc important qui me bloque, c'est que je "perde en route" ma variable m_CCameraList créée dans ListCamera() [Camera.cpp] quand je veux m'en servir dans GetConnectedCamera() [MyProjectDoc.cpp]

  16. #16
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Le convertir d'abord
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CMainFrame* pFrame = static_cast<CMainFrame*>(m_pMainWnd);
    ensuite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CMyProjectDoc* pDoc = static_cast<CMyProjectDoc*>(pFrame->GetActiveDocument());
    Gabrielly

  17. #17
    Membre éclairé
    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
    Par défaut
    Vu pour ça (faut le savoir! ); merci.

    Mais le fameux m_CCameraList est toujours inconnu dans GetConnectedCamera() et donc pos vaut toujours 0x00000000.

  18. #18
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    m_CCameraList est -il déclarer dans le document :

  19. #19
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Est-ce que tu connais le nombre de caméras :

  20. #20
    Membre éclairé
    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
    Par défaut
    Oui et non, comme tu l'avais fait : au début de GetConnectedCamera() en faisant :
    CCamera::CCameraList m_CCameraList;

    après ta question, je l'ai mis en commentaire et je l'ai plutôt mis dans MyProjectDoc.h mais là, une exception que j'ai recopiée ci-dessous.

    Plus grave, je remet comme c'était juste avant et ça ne veut plus s'en aller!!!



    Exception non gérée à 0x784613b1 dans MyProject.exeoint d'arrêt utilisateur. (dans dbgrpt.c)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #undef _CrtDbgBreak
     
    _CRTIMP void _cdecl _CrtDbgBreak(
            void
            )
    {
            DebugBreak();
    }
    Edit : non, je ne connais pas encore le nombre de caméra : je commence à créer les fonctions avec une première (et son SDK) et quand j'aurai fini, j'attaquerai une deuxième, etc.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/05/2006, 22h21
  2. [VBA-E] Comment remplir une ComboBox ?
    Par yaya54 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 07/03/2006, 09h03
  3. comment remplir une table
    Par donny dans le forum Langage SQL
    Réponses: 1
    Dernier message: 12/07/2005, 11h22
  4. erreur quand je veux remplir une CList :
    Par stof dans le forum MFC
    Réponses: 10
    Dernier message: 03/02/2005, 16h18
  5. [SWT] Comment remplir une Table ?
    Par simon77 dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 23/08/2004, 10h31

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