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 :

[toujours en galère] stocker une variable


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 [toujours en galère] stocker une variable
    Voilà la situation:

    Ma Classe1 a une fonction qui permet d'obtenir m_variable

    Je veux que Classe2 récupère cette variable

    Je veux que Classe3 récupère la variable stockée dans Classe2 pour s'en occuper.

    Comment faire? Je n'arrive pas très bien à utiliser les Classe1* pClasse1 = new Classe1 pour ensuite éventuellement faire pClasse1->GetVariable(m_variable).
    Merci.



    Comme je fais des choses qui ne sont pas de la bonne syntaxe, il arrive des trucs bizarres : au moment d'exécuter une instruction qui lui plaît pas, au lieu d'aller dans Classe2.cpp il va dans un classe2.cpp (sans majuscule!!!) qui ne possède pas la fonction critique.
    Je ne sais pas si je me fait bien comprendre mais c'est mystique!

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut Re: stocker une variable dans une classe pour s'en reservir
    Citation Envoyé par stof
    Voilà la situation:

    Ma Classe1 a une fonction qui permet d'obtenir m_variable

    Je veux que Classe2 récupère cette variable

    Je veux que Classe3 récupère la variable stockée dans Classe2 pour s'en occuper.

    Comment faire? Je n'arrive pas très bien à utiliser les Classe1* pClasse1 = new Classe1 pour ensuite éventuellement faire pClasse1->GetVariable(m_variable).
    Merci.
    Bah, ça dépend de ta structure: qui hérite de qui? quelle classe est présente dans quelle classe? etc.

    Citation Envoyé par stof
    Comme je fais des choses qui ne sont pas de la bonne syntaxe, il arrive des trucs bizarres : au moment d'exécuter une instruction qui lui plaît pas, au lieu d'aller dans Classe2.cpp il va dans un classe2.cpp (sans majuscule!!!) qui ne possède pas la fonction critique.
    Je ne sais pas si je me fait bien comprendre mais c'est mystique!
    Je ne comprends pas trop ce que tu veux dire. Quel est le nom exact de ta classe? (il s'agit peut-être d'un nom utilisé par un bibliothèque que tu utilise pour ton appli)
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  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
    Aucune classe n'hérite d'une autre dans mon exemple.

    Je détaille alors : une classe Classe1 possède une fonction qui récupère une image. Alors à la fin de cette fonction, je voudrais bien pouvoir lui dire de l'envoyer dans une autre classe CMyImage.
    Je veux donc stocker l'image dans CMyImage par exemple.
    Je veux que par la suite, la classe CMyView utilise cette image.




    Laisse tomber la deuxième partie du message (il ne s'agit pas de noms utilisés par une bibliothèque puisque ce sont des noms du genre CMyImage).
    Encore un coup de Visual.Net peut-être

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    je verrais bien un truc du style:

    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
    class CImageLoader //une classe pour charger l'image
    {
        bool loadImage();
    ...
        CBitmap m_bmpImage;
    ...
    }
     
    class CMyImage
    {
       CBitmap* getBitmap(){return m_loader.mçbmpImage;}//corps de la methode à mettre dans le .cpp
    ...
    private:
       CImageLoader m_loader;
    }
    et dans la CView, tu déclare un CMyImage m_MyImage, et tu appelles m_MyImage.getBitmap() pour récupérer ton image.

    Dans le code ci-dessus, j'ai considéré ce que tu appelle "mon image" comme une CBitmap, c'est une supposition, je ne sais pas exactement ce que tu entends pas "une image".

    hope it helps.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    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
    Aïe aïe aïe; j'arrive pas.
    Il n'y a pas d'erreur à la compilation mais bizarrement la fonction de CView ne veut pas*** aller appeler la fonction getBitmap de ma classe CMyImage (du coup je ne peux pas vérifier non plus si elle charge bien l'image comme prévu) : moi, ce que j'ai peur, c'est que quand on sorte d'une classe le destructeur bousille l'image.

    Au fait ce que j'appelle image est en fait un pointeur BYTE* qui indique où elle se trouve.

    *** quand j'avance pas à pas, cette ligne est tout simplement sautée!
    Et si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BYTE* m_imagerecuperee;
    CMyImage m_MyImage;
    m_imagerecuperee = m_MyImage.getBitmap();
    le compilateur indique alors :
    la formation d'un pointeur vers un membre requiert l'utilisation explicite de l'opérateur d'adresse ('&') et d'un nom qualifié

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    erf, je me suis trompé. Essaie ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     CBitmap* getBitmap(){return &m_loader.mbmpImage;}//corps de la methode à mettre dans le .cpp
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  7. #7
    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
    Non, non, c'est pas le problème car voilà ma fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    BYTE* CMyImage::getBitmap()
    {
    CClass1* pClass1 = new CClass1; 
    BYTE* m_ImageStockée;
    m_ImageStockée = pClass1->m_ImageClasse1;
    return m_ImageStockée;
    }

    Le problème, comme je disais, c'est qu'on ne rentre pas dedans en fait à partir de la classe CMyView :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void CMyView::TraitementImage()
    {
    BYTE* m_imagerecuperee;
    CMyImage m_MyImage;
    m_imagerecuperee = m_MyImage.getBitmap(); ////  ça ne fait rien à cette ligne!
    ///traitements
    }

  8. #8
    Membre habitué
    Inscrit en
    Avril 2002
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 180
    Points : 157
    Points
    157
    Par défaut
    Salut

    est-ce que tu utilise l'architecture Document vue???
    si ces le cas mait m_variable membre de CDocument puis defini les methode GetDocument() pour les classe 1,2,3

  9. #9
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_imagerecuperee = m_MyImage.getBitmap(); ////  ça ne fait rien à cette ligne!
    fais voir le code de getBitmap()
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  10. #10
    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
    ci-dessus

  11. #11
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    ha pardon

    et pClass1::m_ImageClasse1 est de quel type?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  12. #12
    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
    ben l'image obtenue à l'origine est un pointeur de type BYTE*

    donc quand je fais pClass1->m_ImageClasse1; ça doit me chercher mon pointeur de type BYTE*


    Mais ça n'explique toujours pas pourquoi cette satanée instruction de CMyClassView ne veut pas se faire...

  13. #13
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par stof
    Mais ça n'explique toujours pas pourquoi cette satanée instruction de CMyClassView ne veut pas se faire...
    essaie de changer le nom de ta fonction: getBitmap() est utilisé dans d'autres classes de la MFC. (getMyBitmap p. ex.)
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  14. #14
    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
    En fait je ne l'appelle pas getBitmap, c'est juste parce que t'as écrit ce nom-là alors je ne t'ai pas corriigé pour que tu saches de quoi je parle mais elle s'est toujours appelée BYTE* CMyImage::GetCapturedImage() dans mon programme.

    Galère, galère...

  15. #15
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    le plus simple serait que tu m'envoie le code exact des parties sensibles, parce que là, je vois pas...
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  16. #16
    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
    Allez, je met l'ensemble :

    La classe CCameraX qui récupère l'image (héritée de CCamera, je sais pas si c'est important pour le problème) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void CameraX::Capture()
    {
    /// elle fait différentes choses et finit par récupérer  le pointeur de type BYTE* qui s'appelle disons m_ImageCam
    }

    La classe CMyImage qui stocke l'image:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    BYTE* CMyImage::GetCapturedImage()
    {
    CCamera m_Cam;
    BYTE* m_ImageStockée;
    m_ImageStockée = m_Cam.m_ImageCam;
    return m_ImageStockée; 
    }

    La classe CMyProjectView qui veut s'en servir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void CMyProjectView::Traitements()
    {
    	BYTE* m_imagerecuperee;
            CMyImage m_MyImage;
    	m_imagerecuperee = m_MyImage.GetCapturedImage(); // la fonction GetCapturedImage ne fonctionne pas 
    }
    la fonction GetCapturedImage ne fonctionne pas car je pense que m_ImageCam a du être détruit à la sortie de la classe CCamera.
    Quand je regarde ce qui se passe, je n'ai que :
    m_ImageStockée = 0xccccccccc <Ptr> Incorrect

    D'où la conclusion : je ne maîtrise pas comment garder de côté une variable, problème de communication inter-classes.

  17. #17
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par stof
    je pense que m_ImageCam a du être détruit à la sortie de la classe CCamera.
    C'est exactement ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    BYTE* CMyImage&#58;&#58;GetCapturedImage&#40;&#41; 
    &#123; 
    CCameraX m_Cam; 
    BYTE* m_ImageStockée; 
    m_ImageStockée = m_Cam.m_ImageCam; 
    return m_ImageStockée; 
    &#125;
    Dans cette fonction:
    1/ tu créé un objet CCameraX
    2/ tu créé un pointeur m_ImageSockee (tu ne devrais pas utiliser d'accents)
    3/ tu fais pointer ton pointeur sur un élément de ton objet créé en 1/
    4/ tu efface ton objet (cet objet est déclaré dans la fonction, il est donc effacé automatiquement à la sortie de la fonction)
    résultat: ton pointeur pointe sur un emplacement erroné.

    Solution: m_Cam: si tu met m_ devant, ça signifie que c'est une variable membre, et c'est bien ça qu'il faut faire, mais que tu ne fais pas-> déclarer m_Cam dans CMyImage.h (dans la déclaration de la classe). D'ailleurs, où fais-tu le m_Cam.Capture() ?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  18. #18
    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
    Bon, alors j'ai changé mon fusil d'épaule mais toujours le même problème :


    Cette fois, c'est lorsque l'image est récupérée par CCameraX, je l'envoie à CMyImage :
    m_MyImage.GetCapturedImage(m_ImageCapturee);

    CMyProjectView fait ceci:

    void CMyProjectView::Traitements()
    {
    m_imagerecuperee = m_MyImage.m_CapturedImage;
    }


    Et CMyImage fait ceci :

    void CMyImage::GetCapturedImage(BYTE* Image)
    {
    m_CapturedImage = Image;
    }


    Toujours:
    m_imagerecuperee = 0xccccccccc <Ptr> Incorrect

  19. #19
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par stof
    void CMyImage::GetCapturedImage(BYTE* Image)
    {
    m_CapturedImage = Image;
    }
    Alors là, il faut faire extrêment attention: dans cette fonction, tu fais pointer m_CaptureImage sur Image (qui est de type BYTE*). Du coup, si après ta variable Image est effacée, ton pointeur m_CaptureImage va pointer dans le vide
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  20. #20
    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
    Quand je fais ça, l'image arrive bien jusqu'à CMyImage; en revanche, à la sortie de cette classe, c'est foutu pour aller la rechercher.
    On ne peux pas stocker tranquillement une variable en C++?!


    comment je peux faire, au secours!! :o

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/09/2010, 15h29
  2. Réponses: 2
    Dernier message: 10/08/2010, 12h21
  3. Stocker une variable puis la réutiliser?
    Par centrale dans le forum Simulink
    Réponses: 2
    Dernier message: 13/01/2010, 16h23
  4. stocker une variable server
    Par benneb dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 12/11/2008, 15h49
  5. [C# 2.0] Comment stocker une variable dans une webform
    Par hirochirak dans le forum ASP.NET
    Réponses: 5
    Dernier message: 23/11/2006, 11h10

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