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 :

[MFC] CWinApp pointeur


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par défaut [MFC] CWinApp pointeur
    Bonjour à tous
    Farscape a écrit
    une variable globale c'est mal ...
    si il ne doit exister qu'une instance de cet objet alors tu peux le placer dans la classe d'application derivée de CWinApp.
    tu pourras y acceder de partout en utilisant .
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CAngelApp *pTheApp=static_cast<CAngelApp *>(AfxGetApp()); 
    // exemple d'acces : 
    pTheApp->m_Stock.mesclasses.Find("toto") ;//(etc )
    dans mon prog :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pTheApp->Stock.messalles.GetNext(posj)   //ca marche
    pTheApp->Stock.messalles.AddTail("toto"); //ca marche pas ::
    il compile sans erreur mais fait une "assertion failed"
    ASSERT_VALID fails with illegal vtable pointer.

    si je supprime la ligne du bas ca marche, d'où ma question
    "acceder" dans la citation a le sens de lire et écrire ou de lire seulement ?
    Sinon où est l'erreur ??

    Merci à tous

  2. #2
    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
    salut,
    tu peux faire ce que tu veux a condition que l'objet soit valide ..
    faudrait voir le contexte ..
    faire GetNext sans faire GetHeadPosition ç'est pas normal .
    sinon tu as un bug avant qui pertube la memoire .

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par défaut
    Voila la fonction entiere pour le contexte


    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
    ////////////////////////////////////
    void CNomDesSalles::OnAjoutersalle() 
    ///////////////////////////////////////////
    {
    	CAngelApp *pTheApp=static_cast<CAngelApp *>(AfxGetApp());  //recup du pointeur
     
    	if (GetDlgItemText(IDC_NEWSALLE,m_NEWSALLE)!=0)   // test si newsalle contient du texte
    {
    // recherche pour voir si le nom saisi existe déja
     
       bool existedeja=false;
       POSITION posj= pTheApp->Stock.messalles.GetHeadPosition();	//recup pos init de la cstringlist
     
    	while (posj!=NULL)		// recherche jusqu'a null					
    	{		if (pTheApp->Stock.messalles.GetAt(posj)== m_NEWSALLE)     // si le nom existe deja ds
    	{existedeja=true;}										//cstringlist alors true
    	pTheApp->Stock.messalles.GetNext(posj);}
     
    /// analyse du resultat de la recherche
     
    if (existedeja==true)					// si existe deja alors message
        {
        AfxMessageBox("La Salle est déja prise\nChoisissez un autre nom.",MB_OK|MB_ICONSTOP);
        m_NEWSALLECTRL.SetFocus();
        }
    else									// sinon maj 
    {		
        m_LISTESALLECTRL.AddString(m_NEWSALLE);			//maj listbox
     
       CAngelApp *pTheApp=static_cast<CAngelApp *>(AfxGetApp());  // mis ou pas change rien !!
       pTheApp->Stock.messalles.AddTail("toto");	// maj cstringlist   !!!!!!BUGGGGGGGG !!!!!!!!
    		m_NEWSALLE="";
    		m_NEWSALLECTRL.SetFocus();			// maj focus pour 2eme entrée
    		UpdateData(false);
     
     
    }

  4. #4
    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
    salut,
    rien d'anormal la dedans le probleme doit etre avant.
    sinon petits conseils:
    adopte les conventions d'ecritures windows ,ça rendra plus clair ton code.
    tu les trouveras expliquées dans mon tuto (lien dans ma signature).

    cette portion de code peut s'ecrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while (posj!=NULL)      // recherche jusqu'a null               
            {
                if (pTheApp->Stock.messalles.GetAt(posj)== m_NEWSALLE)     // si le nom existe deja ds
                {
                    existedeja=true;
                }                              //cstringlist alors true
                pTheApp->Stock.messalles.GetNext(posj);
            }
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            while (posj!=NULL)      // recherche jusqu'a null               
            {
                if (pTheApp->Stock.messalles.GetNext(posj)== m_NEWSALLE)     
                    existedeja=true;
            }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par défaut
    Salut à tous

    Mauvaise nouvelle pour moi !!!!
    il n'y a rien dans le prog avant ! je déclare et c'était la première utilisation dans la 1ère boite de dialogue.
    j'ai essayé de rentrer des infos bidon dans le OnInitialUpdate() de CAngel View pour voir si ca venait de la boite de dialoque. La sanction est immédiate "assertion failed" dès le début.

    J'ai ouvert mon prog VC++ sous VS. En compilant VS trouve 2 erreurs et 1 avertissement !! à la différence de VC++

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Édition des liens en cours...
    LINK : warning LNK4075: ' /EDITANDCONTINUE' ignoré à cause de la spécification '/INCREMENTAL:NO'
    angel.obj : error LNK2019: symbole externe non résolu "public: __thiscall CStockage::CStockage(void)" (??0CStockage@@QAE@XZ) référencé dans la fonction "public: __thiscall CAngelApp::CAngelApp(void)" (??0CAngelApp@@QAE@XZ)
    .\Debug/angel.exe : fatal error LNK1120: 1 externes non résolus
    Le probleme semble venir du constructeur de CStokage
    petite modification au hasard (; en {}) et ça marche tout bien dans toutes les boites de dialogue.

    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 CStockage
    {
    public:
    //constructeur destructeur
    	CStockage(){}             // !!!!remplacement de ; par {}
     
    	~CStockage(){	}
     
    CStringList	mesclasses ;  // liste  des noms des classes
    CStringList	messalles ;		
    CStringList mesformesdesalles;
     
    private:
     
    };
    retour sur VC++ meme correction en me disant cool j'ai trouvé !
    résultat : plantage toujours le meme !!!!!!

    les 2 progs ne compileraient pas de la meme manière ??

    y a t il une explication rationelle ?

  6. #6
    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
    salut,
    Comme dirait mulder la vérité est ailleurs ...
    ça doit être gros comme une maison ,tu peux montrer comment tu as declaré la variable Stock dans la classe d'application ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par défaut
    Salut Farscape
    j'ai partiellement résolu le problème en travaillant sous VS au lieu de VC++. Ca m'a permis de faire fonctioner mes 3 boites de dialogue consacrées aux salles et aux classes.
    Hier soir, j'ai ajouté dans CStockage.h une classe pour gerer les eleves(nom prenom classe ). BOUM assertion failed, le retour. Mais cette fois, le compilateur ne signale qu'un avertissement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LINK : warning LNK4075: ' /EDITANDCONTINUE' ignoré à cause de la spécification '/INCREMENTAL:NO'
    Comme tu me le demandes, voici la déclaration de Stock dans CAngelApp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "CStockage.h"
     
    class CAngelApp : public CWinApp
    {
    public:
    	CAngelApp();
     
    	CStockage Stock;
    	CList<Celeve,Celeve> Eleves;
    dans OnInitialUpdate() de CAngelView
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CAngelApp *pTheApp=static_cast<CAngelApp *>(AfxGetApp()); 
    CSalle salle
    salle.monnomsalle="salle 17";
    salle.maformesalle="00 00 00 00\r\n00 00 00\r\n00 00 00";
    salle.monnbdeplacesalle=20;
    pTheApp->Stock.messalles.AddTail(salle); //marche ok
     
    Celeve eleve;
    eleve.sonnom="toto";
    eleve.sonprenom="titi";
    eleve.saclasse="4°1";
    pTheApp->Eleves.AddTail(eleve);      // fait planter dès le début
    Une fois n'est pas coutume, je joins une copie d'écran après le plantage, ça pourra peut etre t'aider, pour moi c'est une langue étrangère.
    Merci encore de t'interesser à mes problèmes.


  8. #8
    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
    salut,
    bon je pense avoir compris ....
    reprenons calmement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CStringList   messalles ;
    c'est fait pour stocker une liste de CString.
    et toi tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pTheApp->Stock.messalles.AddTail(salle); //marche ok
    tu lui inseres un objet salle ,donc rien a voir avec une CString ...
    donc tu exploses la memoire quelque part .

    Attention aussi sur les declarations d'objets utilisés avec des conteneurs .
    pour inserer dans une CList ou CArray le contructeur de copie ou l'operateur d'affection (de l'objet) suivant les cas est appelé .
    il convient donc dans le cas d'un objet classe de prendre l'habitude de founir ces methodes.
    exemple voir l'objet CItem dans la faq sur le sujet de la serialisation de conteneur :
    http://c.developpez.com/faq/vc/?page...HowToSerialize


  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par défaut
    Salut Farscape et merci encore pour ton aide

    non ce n'est pas ca le probleme. La ligne que tu declares ne pas fonctionner est la "seule" qui fonctionne. Tu ne peux pas le deviner car l'info que tu utilises (CStringList messalles ) est périmée. En fait pour éviter le probleme de l'indicateur POSITION qui diffère pour chaque CList , j'ai crée une class CSalle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class CSalle
    {
    public:
    //constructeur destructeur
    	CSalle(){}
    	~CSalle(){	}
     
    CString	monnomsalle ;
    CString	maformesalle ;
    int monnbdeplacesalle;
    };
    et dans la classe CStockage, j'ai fait une CList de CSalle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class CStockage
    {
    public:
    //constructeur destructeur
    	CStockage(){}
    	~CStockage(){}
     
    CStringList	mesclasses ;  // liste  des noms des classes
    CList <CSalle,CSalle> messalles;  //<--------liste nom forme et nb de place des salles
    CList <Celeve,Celeve> meseleves;
    };
    Dans CAngelApp, je déclare Stock comme membre de CStockage

    il faut donc bien mettre un objet salle pour AddTail ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pTheApp->Stock.messalles.AddTail(salle);
    Ca marche impécable pour les salles(nom forme nb de place) sur plusieurs boite de dlg
    en utilisant le meme principe pour les élèves (Celeve) ca explose !!!!!
    Ce qui me tue, c'est que ce sont deux class quasi identiques déclarées au meme endroit. l'une fonctionne, pas l'autre !!!

    voici la class eleve (declaré au dessus de CStockage)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Celeve
    {
    public:
    //constructeur destructeur
    	Celeve(){}
    	~Celeve(){}
     
    	CString sonnom;
    	CString sonprenom;
    	CString saclasse;
    };
    pour l'exemple fourni : ouhlala !!! on est obligé de faire tout ca pour stocker quelques chiffres ???

  10. #10
    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
    re,
    je crois que a part voir le code en direct live ,je peux rien dire de plus ...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par défaut
    J'essaie de modifier en fct de l'exemple de serialisation
    et si ca marche pas, je te recontacte.

    Merci

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par défaut BONNE NOUVELLE !!!!!!!!!!!!!!
    Je suis reparti d'une ancienne version ,j'ai reconstruit ma classe eleve selon l'exemple fourni, apparemment, le problème venait du fait qu'il manquait des morceaux (le constructeur de copie ..)

    ce que je m'explique pas, c'est que dans mes autres classes, ils n'y sont pas et ça marche ... (mais jusqu'à quand)

    Un grand merci pour tout.

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

Discussions similaires

  1. C++ MFC Stockage pointeur
    Par electro8051 dans le forum MFC
    Réponses: 1
    Dernier message: 26/08/2013, 10h27
  2. [MFC] Accès pointeur qui donne rien :s
    Par EagleEye dans le forum MFC
    Réponses: 3
    Dernier message: 02/03/2006, 18h32
  3. [MFC] CWinApp et CDialog
    Par teddy311 dans le forum MFC
    Réponses: 15
    Dernier message: 26/01/2006, 11h08
  4. [MFC] Problème pointeur sur une classe
    Par mick74 dans le forum MFC
    Réponses: 7
    Dernier message: 14/04/2004, 14h17
  5. [MFC] Problème de pointeur !!
    Par acastor dans le forum MFC
    Réponses: 7
    Dernier message: 19/03/2004, 15h50

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