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 :

Modification inattendue d'une variable


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut Modification inattendue d'une variable
    Bonjour à tous,

    dans une CDialog, j'ai :
    - une variable membre m_MaVariable de type int
    - un bouton identifié IDC_MonBouton.

    La valeur de m_MaVariable est MODIFIEE après l'instruction :

    GetDlgItem(IDC_MonBouton)->ShowWindow(SW_HIDE);

    J'ai vérifié en pas à pas et c'est ShowWindow qui provoque la modification, mais je ne vois pas pourquoi et comment...

    Quelqu'un aurait-il une explication ou des conseils pour trouver l'erreur ?

  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,
    met un point d'arrêt dans DodataExchange pour voir si il y a un transfert de donnée..

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut
    Négatif, pas de passage par DoDataExchange au cours de la modification de la variable...

  4. #4
    Membre chevronné
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    Bonjour,

    C'est quand même bizarre que la valeur soit modifiée par cette instruction. Tu es sûr que le débugueur est en phase avec ton code ? Pour être un peu plus sûr, tu devrais peut-être nettoyer et recompiler ta solution...

  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
    met un point d'arrêt sur toutes les affectations directes de cette variable.
    si c'est toujours négatif, il ne reste plus que le débordement mémoire, ou le mauvais diagnostic : tu ne regardes pas la bonne variable -> il te faut vérifier son adresse dans le debugger (avant modif et après ).

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut
    Quelques précisions :

    Je fais dans cette CDialog des "choses" qui pourraient, peut-être, être la cause de la modification décrite plus haut.

    Comme j'ai 50 boutons que je dois déplacer dynamiquement, j'ai déclaré le tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CButton* m_pB [50];
    Je l'initialise dans OnInitDialog :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    m_pB[0] = (CButton*) GetDlgItem(IDC_Bouton0);
    m_pB[1] = (CButton*) GetDlgItem(IDC_Bouton1);
    ...
    m_pB[49] = (CButton*) GetDlgItem(IDC_Bouton49);
    Pour déplacer mes boutons, j'ai le code :
    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
     
    //Extinction des boutons
    for (int i = 0 ; i <= 49 ; i++)
       m_pB[i]->ShowWindow(SW_HIDE);
     
    //Déplacement vertical de DeltaH des boutons
    WINDOWPLACEMENT WndPl;
    int DeltaH = 20;
    for (int i = 0 ; i <= 49 ; i++)
    {
       m_pB[i]->GetWindowPlacement(&WndPl);
       WndPl.rcNormalPosition.bottom += DeltaH;
       WndPl.rcNormalPosition.top += DeltaH;
       m_pB[i]->SetWindowPlacement(&WndPl);
    }
     
    //Allumage des boutons
    for (int i = 0 ; i <= 49 ; i++)
       m_pB[i]->ShowWindow(SW_SHOW);
    J'ai lu qu'un pointeur retourné par GetDlgItem est "temporaire" sans d'ailleurs savoir quelle est la durée de vie.
    Est-ce que les opérations que j'effectue sont valides? sur des pointeurs qui restent valides (après les déplacements)?
    Ou au contraire ces opérations, avec des pointeurs qui ne seraient plus valides, pourraient-elles altérer la mémoire et provoquer la modification dont j'ai parlé au début ?

  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
    Par défaut
    Effectivement ..,
    il vaut mieux stocker les identifiants dans un tableau et faire le GetDlgItem à la demande pour chaque opération.
    le retour de GetDlgItem cause un probléme si il n'y a pas de variables contrôle rattachée à l'identifiant..

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut
    Cela me semble une bonne solution de mettre tous mes identifiants dans un tableau.
    Je n'aurai pas beaucoup plus de code et j'éviterai les soucis avec GetDlgItem.
    Merci pour cette idée que je vais tester.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut
    Citation Envoyé par farscape Voir le message
    le retour de GetDlgItem cause un probléme si il n'y a pas de variables contrôle rattachée à l'identifiant..
    Je n'ai pas compris.
    S'agit-il de tester tester la valeur retournée par GetDlgItem?

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

Discussions similaires

  1. Modification inattendue d'une variable de session
    Par lyrix dans le forum Langage
    Réponses: 2
    Dernier message: 10/01/2008, 00h23
  2. Réponses: 20
    Dernier message: 03/04/2007, 16h45
  3. Modification d'une variable & rafraichissement! HELP!
    Par u115php dans le forum Langage
    Réponses: 4
    Dernier message: 09/09/2006, 01h04
  4. [Eclipse 3.1]Modification d'une variable
    Par thecaptain dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 18/01/2006, 09h17
  5. Réponses: 2
    Dernier message: 29/08/2005, 16h35

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