Violation d'acces c++ [Résolu]

Signaler
Messages postés
17
Date d'inscription
mercredi 7 avril 2010
Statut
Membre
Dernière intervention
20 mars 2013
-
Messages postés
17
Date d'inscription
mercredi 7 avril 2010
Statut
Membre
Dernière intervention
20 mars 2013
-
bonjour,

je suis étudiant de 2eme année de DUT informatique, et viens de commencer c++.
dans ma classe CArmada, j'ai voulu imposer le fait que l'emplacement du sous marin soit unique, et le compilateur me met :

Exception de première chance à 0x5914082a dans armada.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xabababab.

tout marchait bien avant que je n'essaye de mdifier cela(entre balises [b])...

De plus, j'ai testé plusieurs variables pour k (entre balises [u]), mais sans résultats...

voici mes codes ( en gras se situe la ou l'erreur se met...).

Merci d'avance!! =)

CARMADA . CPP

#include "CArmada.h"

CArmada :: CArmada(int unNbre) {

m_pTabSousMarins = new string[unNbre];
m_nbTotSSM = unNbre ;
}

/*************************************/

[b] void CArmada :: RemplirStruct() {
char tab[3];
int i = 0;

while (i<m_nbTotSSM) {
cin.getline(tab, 3, '\n');
string ch(tab);
if (Analyser(ch)){		
m_pTabSousMarins[i]=ch;
if ( i>=1){
for (int k=0; k<=  i ;k++){
if (m_pTabSousMarins[k] ==m_pTabSousMarins[i]){
cout << "cette valeur a déja été entrée, recommencer" << endl;
}
else{
i++;
}	
}	
}
else {
i++;
}
}		
}
 }/b

/************************************/

int CArmada :: getNbreSSM(){

return m_nbTotSSM;
}

/***********************************/

string* CArmada :: getPointSSM(){

return m_pTabSousMarins;
}

/**********************************/

 bool CArmada :: Analyser (string laSaisie){

bool ret = false;
char caract;
char nbre;

caract = laSaisie.at(0);
nbre = laSaisie.at(1);

if (caract>='a' && caract<='j') {
   		cout<<"Vous avez tapé une minuscule."<<endl;
caract = caract + ('A'-'a');
    		cout<<"La majuscule correspondante est "<< caract <<endl;
ret = true;
 	}
else if (caract>='A' && caract<='J') {
ret = true;
}
else {
cout<<"Vous avez tapé un mauvais truc" << endl;
ret = false;
}
if (nbre>='0' && nbre<='9') {
}
else {
ret = false;
}
if (ret == true){
cout << "vous avez un sous marin à la ligne "<< caract << " colonne " << nbre << endl;
}
else {
cout << "position non valide" << endl;
}
return ret;
}
/***********************************/

CArmada :: ~CArmada () {

if ( m_pTabSousMarins!=NULL){

delete[] m_pTabSousMarins;
cout << "Destructeur objet m_pTabSousMarins " << m_pTabSousMarins << endl;

}
}

CARMADA . H !!!!!!!!!!!!!!!!
#ifndef CARMADA_H_
#define CARMADA_H_
#include "Bibli.h"

class CArmada {

private: 
string* m_pTabSousMarins;
int m_nbTotSSM;
public:
CArmada(int unNbre);
~CArmada();
void RemplirStruct();
int getNbreSSM();
string* getPointSSM();
private:
bool Analyser (string laSaisie);

};

#endif /*CARMADA_H_*/

LANCEUR !!!!!!!!!!!

#include "CArmada.h"

int main () {

CArmada C1(3);
C1.RemplirStruct();

}

4 réponses

Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011

Salut,

Il y a un souci avec tes i++. Je n'ai pas bien compris l'imbrication de tes if / for / else ...

En écrivant ce qui suit, ça semble fonctionner mieux.
void CArmada :: RemplirStruct() {
  char tab[3];
  int i = 0;

  while (i<m_nbTotSSM) {
    bool ok = false;

    cin.getline(tab, 3, '\n');
    string ch(tab);
    if (Analyser(ch)){
      ok = true;
      m_pTabSousMarins[i]=ch;
      for (int k=0; k<i && ok; k++){
        if (m_pTabSousMarins[k]==m_pTabSousMarins[i]){
          cout << "cette valeur a déja été entrée, recommencer" << endl;
          ok = false;
        } 
      } 
    }
    if (ok)
      ++i;
  }   
}


Bonne prog,
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
6
Ceci doit être du à une lecture dans un emplacement de tableau qui n'est pas alloué, si tu remplaces
 for (int k=0; k<=i;k++){


par

for (int k=0; k< i;k++){


cela marche-t-il ?

généralement ce genre d'erreur n'affecte pas la compilation, et c'est au moment de l'exécution qu'un joli message accompagné d'un doux BIIIP! fait son apparition...

Bref pour un petit i essaie de compter les nombres dans la boucle, et vérifie que tous les éléments des tableaux existent, genre m_pTabSousMarins[12] alors que m_pTabSousMarins ne va que jusqu'à m_pTabSousMarins[11]. Il ne faut pas oublier qu'un tableau commence à 0, je pense que c'est à cause de ça que ça bug, le inférieur ou égal doit peut-être être remplacé par inférieur tout court.


Pop70
Messages postés
17
Date d'inscription
mercredi 7 avril 2010
Statut
Membre
Dernière intervention
20 mars 2013

merci pop, j'y ai cru au début mais ca n'a finalement rien changé...

c'est le compilateur pendant l'exécution qui me met ce message, tu as raison...

Merci quand même =)
Messages postés
17
Date d'inscription
mercredi 7 avril 2010
Statut
Membre
Dernière intervention
20 mars 2013

en effet, ca marche, Merci bcp chouchou =)