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 :

Fonctionne en Debug mais pas en Release


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Baud10
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 66
    Par défaut Fonctionne en Debug mais pas en Release
    Voilà je développe un petit programme solveur de sudoku (je m'ennui ^^)

    Et je suis tombé sur un petit problème. Mon application fonctionne si elle a été compilée en Debug, mais ne fonctionne pas correctement si elle a été compilée en Release.

    Evidemment, je n'ai pas touché aux paramètres de compilation.

    Mon erreur est par là :
    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
     
    // rappel:
    char map[82];
    CEdit* edit[81];
    // code:
    	char t;
    	CEdit *e;
    	CString str;
    	for(int a=0; a<81; a++) {
    		e = edit[a];
    		e->GetWindowTextW(str);
    		if(str.GetLength()) {
    			t = str.GetAt(0) - '0';
    			ASSERT(t>0);
    			ASSERT(t<=9);
    		}
    		else t = 0;
    		map[a] = t;
    	}
    Seulement voilà, en mode Debug, celà fonctionne : si le CEdit est vide, alors il ajoute 0 dans mon tableau...
    En mode Release, (Visual catch moins d'info?!) je peux voir que mon tableau map ne change pas malgré les affectations...

    ça m'embête un peu car la version Debug fait 2,7 Mo, la Release en fait 330 k...

    Quelqu'un a une idée?

  2. #2
    Membre confirmé Avatar de Baud10
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 66
    Par défaut
    J'ai triffouillé les options,
    en changeant ceci dans les options de configuration Release/Win32:

    Optimisation de "/O2" -> "/Od" (dans C/C++ > Optimisation)
    Vérification d'exécution de "Par défaut" à "Les deux" (dans C/C++ > Génération de code)

    Maintenant ça fonctionne, mais je n'ai toujours pas compris pourquoi...

  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
    salut,
    je pense que tu as simplement déplacé le probléme en mémoire ...
    ce genre de bug est souvent le signe d'un débordement mémoire.
    note que si tu travailles en unicode tu devrais utiliser TCHAR au lieu de char..

  4. #4
    Membre confirmé Avatar de Baud10
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 66
    Par défaut
    Je pense aussi (que j'ai simplement déplacé le problème), mais si je n'en ai aucune preuve;

    En fait, mon tableau de caratères (char map[82])
    contient 81 valeurs (du ASCII 0 à ASCII 9). 81 valeurs = 9x9 (grille sudoku) (un zéro signifiant : pas de chiffre dans la case)
    Et le 82ème char c'est pour mettre un zéro, et "caster" ma grille en char*

    Pour vérifier si ma grille est complète, je fais strlen(map)==81;

    Bref,
    je remplis mon tableau des valeurs comprises entre 1 et 9, selon la valeur des CEdit. Si le CEdit est vide alors je met un zéro.

    en mode release je mets un point d'arrêt avant le for et je vois qu'il entre bien dedans, et qu'il passe dans l'affectation, (dans VS, je mets ma souris sur la variable "map") et je vois que les affectations ne sont pas prises en comptes, et que map contient encore les valeurs en mémoire au moment de la déclaration.

    J'ai rajouté un memset(map,0,82), ce qui, avant d'entrer dans le for, remplis mon tableau de zéro. En débug, celà fonctionne. En release, le memset n'a pas changé les valeurs de map.

    Je soupçonne VS de me donner des indications erronées (en mode release, il a moins d'informations de débug) ...

  5. #5
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char map[82];
    CEdit* edit[81];
    // code:
    	char t;
    	CEdit *e;
    	CString str;
    	for(int a=0; a<81; a++) {
    		e = edit[a];

    Le code est perfectible :
    D"abord un controle se crée en générale avec CWnd::Create ensuite utilise un CArray ou CList plutot qu'un tableau statique

    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
     
    CArray <CEdit*,CEdit*> ArrayEditCtrl;
    //.......
     
    CRect rect;
    int nEditBoxTop=10;
    int nEditBoxID=100; // voir avec fichier RC
    rect.top =nEditBoxTop;
    rect.bottom =rect.top +20;
    rect.left =10;
    rect.right=rect.left+100;
    CEdit *pEdit= new CEdit;  // NE Pas oublier delete
    pEdit->CreateEx (WS_EX_CLIENTEDGE, _T ("EDIT"), NULL,
    WS_CHILD | WS_VISIBLE | ES_LEFT | WS_TABSTOP , rect, this, nEditBoxID);
    ArrayEditCtrl.Add (pEdit);
    pEdit->EnableWindow (TRUE);
    pEdit->SetWindowText ("Edit");
    nEditBoxID++;
    nEditBoxTop+=30
    Boucler de 0 à 80 pour créer une matrice.
    Au besoin sublcasser pEdit pour recevoir les messages

  6. #6
    Membre confirmé Avatar de Baud10
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 66
    Par défaut
    Le code que j'ai donné est placé dans l'évènement d'un clic sur un bouton.

    A mon OnInitDialog, j'ai ceci:
    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
     
    	int a;
    	CEdit *e;
    	for(int j=0; j<9; j++) {
    		for(int i=0; i<9; i++) {
    			a = j*9+i;
    			e = new CEdit();
    			RECT r;
    			r.left = 10+i*28;
    			r.top = 10+j*28;
    			r.right = 10+i*28+22;
    			r.bottom = 10+j*28+22;
    			e->Create(ES_CENTER|WS_VISIBLE|ES_NUMBER|WS_TABSTOP,r,this,a+1000);
    			e->SetWindowTextW(CString());
    			edit[a] = e;
    		}
    	}
    Je créé donc des CEdit, qui s'affichent et fonctionnent correctement. Et je les référence dans un tableau CEdit* edit[81];

    Je n'ai pas besoin de recevoir les messages de mes CEdit (sauf peut être faire un DDV pour limiter a un seul chiffre par cases)

    Et je ne vois pas l'intéret d'utiliser un CArray ou une CList, si je n'ai pas l'intention d'ajouter (insérer) un élément pendant l'exécution.

    PS: mon application est assez bas niveau je le reconnais, mais ça ne devrait pas posser de soucis majeurs ?

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/02/2015, 15h18
  2. Réponses: 5
    Dernier message: 20/09/2014, 07h36
  3. programme fonctionne en debug mais pas en release ?
    Par membreComplexe12 dans le forum C++
    Réponses: 20
    Dernier message: 16/05/2012, 11h52
  4. Réponses: 6
    Dernier message: 14/06/2011, 18h39
  5. regsvr32 failed en debug mais pas en release
    Par afan dans le forum DirectX
    Réponses: 1
    Dernier message: 09/06/2004, 10h32

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