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

Messages postés
17
Date d'inscription
mercredi 7 avril 2010
Dernière intervention
20 mars 2013
- - Dernière réponse : jimdano
Messages postés
17
Date d'inscription
mercredi 7 avril 2010
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();

}

Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Dernière intervention
25 avril 2011
3
Merci
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,

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 97 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Chouchou182
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Dernière intervention
7 janvier 2012
0
Merci
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
Commenter la réponse de pop70
Messages postés
17
Date d'inscription
mercredi 7 avril 2010
Dernière intervention
20 mars 2013
0
Merci
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 =)
Commenter la réponse de jimdano
Messages postés
17
Date d'inscription
mercredi 7 avril 2010
Dernière intervention
20 mars 2013
0
Merci
en effet, ca marche, Merci bcp chouchou =)
Commenter la réponse de jimdano

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.