jimdano
Messages postés16Date d'inscriptionmercredi 7 avril 2010StatutMembreDernière intervention20 mars 2013
-
5 févr. 2011 à 17:36
jimdano
Messages postés16Date d'inscriptionmercredi 7 avril 2010StatutMembreDernière intervention20 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();
}
A voir également:
Violation d'accès lors de la lecture de l'emplacement
cs_Chouchou182
Messages postés252Date d'inscriptionvendredi 13 juin 2003StatutMembreDernière intervention25 avril 20111 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;
}
}
pop70
Messages postés181Date d'inscriptionmardi 6 avril 2010StatutMembreDernière intervention 7 janvier 201210 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.