OVH Cloud OVH Cloud

Erreur d'application

14 réponses
Avatar
Olivier
Bonjour,

Je suis en train de développer une application avec Visual C++ et lorsque ma
classe View va modifier la valeur d'une variable dans une classe CObject
j'ai le message d'erreur suivant :

L'instruction à "0x00402163" emploie l'adresse mémoire "0xcccccce4". La
mémoire ne peut pas être "written".

Kelkun a une idée de ce que ça peut être ?

Cordialement,

Olivier

10 réponses

1 2
Avatar
Fabien LE LEZ
On Fri, 6 May 2005 17:44:04 +0200, "Olivier" :

L'instruction à "0x00402163" emploie l'adresse mémoire "0xcccccce4". La
mémoire ne peut pas être "written".


À vue de nez, l'erreur peut provenir d'à peu près n'importe où. Essaie
d'isoler le code qui déconne ; si ça vient d'un truc spécifique
Windows (comme le début de ton message semble le suggérer), cf
fr.comp.os.ms-windows.programmation.

Kelkun


Ça s'écrit "quelqu'un".

--
Le grand site de la philosophie animale : <http://perso.edulang.com/philo/>

Avatar
Pierre THIERRY
Le Fri, 06 May 2005 17:44:04 +0200, Olivier a écrit :
j'ai le message d'erreur suivant :

L'instruction à "0x00402163" emploie l'adresse mémoire "0xcccccce4".
La mémoire ne peut pas être "written".

Kelkun a une idée de ce que ça peut être ?


Un message d'erreur complètement naze ?

Naïvement,
Nowhere man
--

OpenPGP 0xD9D50D8A

Avatar
Olivier
J'ai isolé le code qui plante de la maniere suivante :

void CSite::SetEchelle(int Echelle)
{
CString strTxt;
strTxt.Format("Echelle = %d",Echelle);
AfxMessageBox(strTxt);

m_iEchelle = Echelle;

strTxt.Format("Echelle 2 = %d",Echelle);
AfxMessageBox(strTxt);
}

Au changement d'échelle, j'ai bien le premier MessageBox qui s'affiche avec
la bonne valeur, mais dès que je clique sur OK -> plantage.
Donc ce qui fait planter c'est : m_iEchelle = Echelle;

Je ne comprends pas...


"Fabien LE LEZ" a écrit dans le message de
news:
On Fri, 6 May 2005 17:44:04 +0200, "Olivier" :

L'instruction à "0x00402163" emploie l'adresse mémoire "0xcccccce4". La
mémoire ne peut pas être "written".


À vue de nez, l'erreur peut provenir d'à peu près n'importe où. Essaie
d'isoler le code qui déconne ; si ça vient d'un truc spécifique
Windows (comme le début de ton message semble le suggérer), cf
fr.comp.os.ms-windows.programmation.

Kelkun


Ça s'écrit "quelqu'un".

--
Le grand site de la philosophie animale :
<http://perso.edulang.com/philo/>



Avatar
Olivier
Je vien d'essayer un autre truc.
En fait si dans ma fonction "void CSite::SetEchelle(int Echelle)" je met
"m_iEchelle = 0;" ça plante mais si je met "m_iEchelle = 0;" dans la
fonction "void CSite::Draw(CDC *pDC)" là tout se passe bien...
Une explication ?

"Olivier" a écrit dans le message de
news:427c5ba3$0$26072$
J'ai isolé le code qui plante de la maniere suivante :

void CSite::SetEchelle(int Echelle)
{
CString strTxt;
strTxt.Format("Echelle = %d",Echelle);
AfxMessageBox(strTxt);

m_iEchelle = Echelle;

strTxt.Format("Echelle 2 = %d",Echelle);
AfxMessageBox(strTxt);
}

Au changement d'échelle, j'ai bien le premier MessageBox qui s'affiche
avec

la bonne valeur, mais dès que je clique sur OK -> plantage.
Donc ce qui fait planter c'est : m_iEchelle = Echelle;

Je ne comprends pas...


"Fabien LE LEZ" a écrit dans le message de
news:
On Fri, 6 May 2005 17:44:04 +0200, "Olivier" :

L'instruction à "0x00402163" emploie l'adresse mémoire "0xcccccce4". La
mémoire ne peut pas être "written".


À vue de nez, l'erreur peut provenir d'à peu près n'importe où. Essaie
d'isoler le code qui déconne ; si ça vient d'un truc spécifique
Windows (comme le début de ton message semble le suggérer), cf
fr.comp.os.ms-windows.programmation.

Kelkun


Ça s'écrit "quelqu'un".

--
Le grand site de la philosophie animale :
<http://perso.edulang.com/philo/>







Avatar
Serge Paccalin
Le samedi 7 mai 2005 à 08:12:24, Olivier a écrit dans fr.comp.lang.c++ :

L'instruction à "0x00402163" emploie l'adresse mémoire "0xcccccce4". La
mémoire ne peut pas être "written".


J'ai isolé le code qui plante de la maniere suivante :


void CSite::SetEchelle(int Echelle)
{
CString strTxt;
strTxt.Format("Echelle = %d",Echelle);
AfxMessageBox(strTxt);

m_iEchelle = Echelle;

strTxt.Format("Echelle 2 = %d",Echelle);
AfxMessageBox(strTxt);
}

Au changement d'échelle, j'ai bien le premier MessageBox qui s'affiche avec
la bonne valeur, mais dès que je clique sur OK -> plantage.
Donc ce qui fait planter c'est : m_iEchelle = Echelle;

Je ne comprends pas...


Une note en passant : au cas où tu n'aurais pas remarqué, les autres
répondent en-dessous, en supprimant ce qui ne sert pas ; tu es prié d'en
faire autant. D'avance merci.

Si ça plante au moment de l'affectation d'une donnée membre, il est
probable que l'object concerné n'est pas valide. Le problème est sans
doute avant l'appel à SetEchelle. Par exemple :

CSite *pSite; // pas initialisé
pSite->SetEchelle(42); // A fait boum le programme

Ou encore :

CSite *pSite = NULL;

{
CSite Site; // Construction
pSite = &Site; // Affectation
} // Destruction

pSite->SetEchelle(42); // A fait boum le programme

A priori, une valeur comme 0xcccccce4, ça me fait penser au pointeur pas
initialisé. Avec Visual C++ en mode débug, les variables non
initialisées sont remplies de 0xcc (alors que les blocs mémoire sont
remplis de 0xcd, et les objets détruits, remplis de 0xfeee). Ta donnée
membre m_iEchelle est à l'offset 0x18 dans ta classe CSite.

--
___________ 07/05/2005 10:07:28
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763



Avatar
Yalbrieux
Bonjour,
En supposant m_iEchelle convenablement déclaré dans l'entête (oui ?),
si vous appelez la méthode SetEchelle( ) avant la construction de CSite ça
plante.
Si vous passez par Draw c'est que vous avez construit et ça ne plante pas.
J'ai bon ?
Cordialement
Yves
Avatar
Olivier
J'ai essayé en créant un pointeur sur ma classe CSite dans le fichier header
de ma classe View :
private:
CSite* m_pSite;

Puis au changement d'échelle j'ai mis :
if (m_pSite)
m_pSite->SetEchelle(m_iEchelle);

Et toujours le même message :
L'instruction à "0x0040200e" emploie l'adresse mémoire "0xcdcdcde5". La
mémoire ne peut être "written".

C'est un truc de fou...
Avatar
Vincent Lascaux
C'est un truc de fou...


Poste un code minimal executable (avec une fonction main et tout) qui
plante...

--
Vincent

Avatar
Yalbrieux
Bonsoir,

[...]
CSite* m_pSite;
[...]

if (m_pSite)
m_pSite->SetEchelle(m_iEchelle);


C'est ce dont je me doutais.
Après déclaration de votre pointeur ajoutez :
m_pSite=new CSite ; // pour construire un objet CSite
Ca devrait mieux aller :)

Et n'oubliez pas le
delete m_pSite ; // quand il n'y en a plus besoin

Cordialement
Yves

Avatar
Olivier
Super merci, ça marche...
1 2