Violation d'acces c++

Résolu
jimdano Messages postés 17 Date d'inscription mercredi 7 avril 2010 Statut Membre Dernière intervention 20 mars 2013 - 5 févr. 2011 à 17:36
jimdano Messages postés 17 Date d'inscription mercredi 7 avril 2010 Statut Membre Dernière intervention 20 mars 2013 - 6 févr. 2011 à 16:24
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

cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
6 févr. 2011 à 15:08
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,
3
pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 10
5 févr. 2011 à 19:20
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
0
jimdano Messages postés 17 Date d'inscription mercredi 7 avril 2010 Statut Membre Dernière intervention 20 mars 2013
5 févr. 2011 à 20:21
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 =)
0
jimdano Messages postés 17 Date d'inscription mercredi 7 avril 2010 Statut Membre Dernière intervention 20 mars 2013
6 févr. 2011 à 16:24
en effet, ca marche, Merci bcp chouchou =)
0