Problème de violation d'écriture

Signaler
Messages postés
2
Date d'inscription
dimanche 3 juin 2012
Statut
Membre
Dernière intervention
4 juin 2012
-
Messages postés
2
Date d'inscription
dimanche 3 juin 2012
Statut
Membre
Dernière intervention
4 juin 2012
-
Bonjour à tous je suis actuellement en première année d'école d'ingénieur et je dois réaliser un projet d'informatique de simulation de match de foot. Le projet fonctionne presque j'ai juste une erreur lors du chargement d'un fichier binaire dans lequel je doit sauvegarder mes données. En effet arriver à une ligne voir code ci-dessous j’obtiens un message d'erreur : violation d'accès lors de l'écriture à l'emplacement ...

Je ne vois pas trop d'où pourrait venir le problème j'ai pensé qu'il s'agirait peut être d'une interdiction d'écriture dans la classe mais pourquoi ??

Ma classe competition.h
#ifndef COMPETITION
#define COMPETITION

#include"equipe.h"
#include <vector>
#include <cstdlib>
#include <time.h>
#include <Windows.h>


typedef struct  score score ;
struct  score
{
equipe* es1,*es2;
unsigned short s1,s2;
unsigned short v1,v2;
};


class  competition
{
private:
 string nom;
 vector<equipe*> tabeq;
 vector<score> tabsc;	
 unsigned short numDeJeux;
 equipe* Vainqueur;
 unsigned short numCompet;
public : 
string get_nom();
void afficher_equipe() ;
void afficher_resultat();
void afficher_toutResultat();
void jouer_match();
void set_tabeq(vector<equipe*> &);
equipe* get_Vainqueur();
void set_nom(string);
void set_num(unsigned short);
short get_num();
void sauvegarde(ofstream &fich);
void chargement(ifstream &fich);
};
#endif COMPETITION


Et son cpp
# include "competition.h"


string competition::get_nom()
{
return this->nom;
}
void competition::afficher_equipe()
{
short i;

cout<<"Les equipes qui participent a cette competition sont :"<<endl;
for (i=0;i<tabeq.size();i++)
{
cout<<"=> L equipe : "<<tabeq.at(i)->get_nom()<<"\t numero "<<tabeq.at(i)->get_num()<<endl;
}
}
void competition::afficher_resultat()
{
short i;

do
{
cout<<"Quel match voulez vous afficher ?"<<endl;
cin>>i;
}while((i>=this->numDeJeux)&&(i>0));
cout<<"Ce match qui a oppose "<<tabsc[i-1].es1->get_nom()<<" et "<<tabsc[i-1].es2->get_nom()<<endl;
cout<<"c'est solde par le score de : "<<tabsc[i-1].s1<<"-"<<tabsc[i-1].s2<<endl;
if (tabsc[i-1].v1==1)
cout<<"L equipe "<<tabsc[i-1].es1->get_nom()<<" a gagner"<<endl;
else
cout<<"L equipe "<<tabsc[i-1].es2->get_nom()<<" a gagner"<<endl;
}
void competition::afficher_toutResultat()
{
short i;

for (i=0;i<numDeJeux-1;i++)
{
cout<<"Le match qui a oppose "<<tabsc[i].es1->get_nom()<<" et "<<tabsc[i].es2->get_nom()<<endl;
cout<<"c'est solde par le score de : "<<tabsc[i].s1<<"-"<<tabsc[i].s2<<endl;
if (tabsc[i].v1==1)
cout<<"L equipe "<<tabsc[i].es1->get_nom()<<" a gagner"<<endl;
else
cout<<"L equipe "<<tabsc[i].es2->get_nom()<<" a gagner"<<endl;
cout<<"-------------------------------------------"<<endl;
}
}
void competition::jouer_match()
{
short i,j,k, nbrParticipants, nbrMatch,var, nbrTour;
equipe* temporaire;
vector<short> tabJeux;
nbrParticipants=tabeq.size();
numDeJeux=nbrParticipants;
var=nbrParticipants;
nbrMatch=0;
nbrTour=0;
srand(time(NULL));
do{
nbrMatch+=var/2; 
var/=2;
tabJeux.push_back(var);
nbrTour++; //On cherche le nombre de match et de tour		
}while(var!=1);
for(i=0;i<nbrTour;i++)
{
if(i==0) //Initialisation premier tour
{
for(j=1;j<nbrParticipants;j++)
{
var=rand()%(nbrParticipants-1);
temporaire=tabeq.at(var);
tabeq.at(var)=tabeq.at(j-1);
tabeq.at(j-1)=temporaire;  //On mélange le tableau des équipes 
}
for(j=0;j<nbrParticipants/2;j++)
{
tabsc.resize(j+1);
tabsc.at(j).es1=tabeq.at(2*j);					
tabsc.at(j).es2=tabeq.at((2*j)+1); //Enfin on répartire ce tableau mélangé dans les match du premier tour					
}
for(j=1;j<tabJeux.size();j++)
{
tabsc.resize(tabsc.size()+tabJeux.at(j));
}
var=0;
}
//On joue les match d'un tour
//on déplace le gagnant de chaque match dans le match supérieur
//puis on fait le nouveau tour
//on répète jusqu'au gagnant
for(k=0;k<tabJeux.at(i);k++)
{	
var=k+(i*2*tabJeux.at(i));
tabsc.at(var).s1=rand()%5;
tabsc.at(var).s2=rand()%5; //On a joué le match
if (tabsc.at(var).s1 > tabsc.at(var).s2)
{
tabsc.at(var).v1=1;
tabsc.at(var).v2=0;
tabsc.at(var).es1->set_stat(1);
tabsc.at(var).es2->set_stat(-1);
var++;
if((var%2==1)&&(i<nbrTour-1)) //La remonté s'éffectue mal match de l equipe contre equipe
{
tabsc.at(var+tabJeux.at(i)-(k/2)-1).es1=tabsc.at(var-1).es1;
}
else if (i<nbrTour-1)
{
tabsc.at(var+tabJeux.at(i)-((k+1)/2)-1).es2=tabsc.at(var-1).es1;
}
cout<<"Match numero :"<<var<<endl;
var--;
cout<<"L equipe "<<tabsc.at(var).es1->get_nom()<<"\t marque "<<tabsc.at(var).s1<<" but"<<endl;
cout<<"L equipe "<<tabsc.at(var).es2->get_nom()<<"\t marque "<<tabsc.at(var).s2<<" but"<<endl;
cout<<"L equipe "<<tabsc.at(var).es1->get_nom()<<" gagne"<<endl;
cout<<"---------------------------------------------------------"<<endl;
}
else if (tabsc.at(var).s2 > tabsc.at(var).s1)
{
tabsc.at(var).v1=0;
tabsc.at(var).v2=1;
tabsc.at(var).es2->set_stat(1);
tabsc.at(var).es1->set_stat(-1);
var++;
if((var%2==1) && (i<nbrTour-1))
{
tabsc.at(var+tabJeux.at(i)-(k/2)-1).es1=tabsc.at(var-1).es2;
}
else if (i<nbrTour-1)
{
tabsc.at(var+tabJeux.at(i)-((k+1)/2)-1).es2=tabsc.at(var-1).es2;
}
cout<<"Match numero :"<<var<<endl;
var--;
cout<<"L equipe "<<tabsc.at(var).es1->get_nom()<<"\t marque "<<tabsc.at(var).s1<<" but"<<endl;
cout<<"L equipe "<<tabsc.at(var).es2->get_nom()<<"\t marque "<<tabsc.at(var).s2<<" but"<<endl;
cout<<"L equipe "<<tabsc.at(var).es2->get_nom()<<" gagne"<<endl;
cout<<"---------------------------------------------------------"<<endl;
}
else
{
tabsc.at(var).es2->set_stat(0);
tabsc.at(var).es1->set_stat(0);
cout<<"Match numero :"<<var+1<<endl;
cout<<"L equipe "<<tabsc.at(var).es1->get_nom()<<"\t marque "<<tabsc.at(var).s1<<" but"<<endl;
cout<<"L equipe "<<tabsc.at(var).es2->get_nom()<<"\t marque "<<tabsc.at(var).s2<<" but"<<endl;
cout<<"Prolongement au tir au but"<<endl;
do {
tabsc.at(var).s1=rand()%5;
tabsc.at(var).s2=rand()%5;
}while(tabsc.at(var).s1==tabsc.at(var).s2);
if (tabsc.at(var).s1 > tabsc.at(var).s2)
{
tabsc.at(var).v1=1;
tabsc.at(var).v2=0;
var++;
if((var%2==1)&&(i<nbrTour-1))
{
tabsc.at(var+tabJeux.at(i)-(k/2)-1).es1=tabsc.at(var-1).es1;
}
else if (i<nbrTour-1)
{
tabsc.at(var+tabJeux.at(i)-((k+1)/2)-1).es2=tabsc.at(var-1).es1;
}
var--;
cout<<"L equipe "<<tabsc.at(var).es1->get_nom()<<"\t marque "<<tabsc.at(var).s1<<" but"<<endl;
cout<<"L equipe "<<tabsc.at(var).es2->get_nom()<<"\t marque "<<tabsc.at(var).s2<<" but"<<endl;
cout<<"L equipe "<<tabsc.at(var).es1->get_nom()<<" gagne"<<endl;
cout<<"---------------------------------------------------------"<<endl;
}
else 
{
tabsc.at(var).v1=0;
tabsc.at(var).v2=1;
var++;
if((var%2==1) && (i<nbrTour-1))
{
tabsc.at(var+tabJeux.at(i)-(k/2)-1).es1=tabsc.at(var-1).es2;
}
else if (i<nbrTour-1)
{
tabsc.at(var+tabJeux.at(i)-((k+1)/2)-1).es2=tabsc.at(var-1).es2;
}
var--;
cout<<"L equipe "<<tabsc.at(var).es1->get_nom()<<"\t marque "<<tabsc.at(var).s1<<" but"<<endl;
cout<<"L equipe "<<tabsc.at(var).es2->get_nom()<<"\t marque "<<tabsc.at(var).s2<<" but"<<endl;
cout<<"L equipe "<<tabsc.at(var).es2->get_nom()<<" gagne"<<endl;
cout<<"---------------------------------------------------------"<<endl;
}
}
}
}
if (tabsc.back().v1==1)
Vainqueur=tabsc.back().es1;
else
Vainqueur=tabsc.back().es2;

}
void competition::set_tabeq(vector<equipe*> &LesEquipes)
{
int i;

for(i=0;i<LesEquipes.size(); i++)
{
tabeq.push_back(LesEquipes.at(i));
}
}
equipe* competition::get_Vainqueur()
{
return Vainqueur;
}
void competition::set_nom(string N)
{
this->nom=N;
}
void competition::set_num(unsigned short n)
{
this->numCompet=n;
}
short competition::get_num()
{
return this->numCompet;
}

void competition::sauvegarde(ofstream &fich)
{
int i;
size_t neq,l;
char *name;

fich.write((char*) &numCompet, sizeof(unsigned short));
name=new char [nom.size()+1];
strcpy (name, nom.c_str());
l=nom.size()+1;
fich.write((char*) &l, sizeof(size_t));
fich.write((char*) name, l*sizeof(char));
fich.write((char*) &numDeJeux, sizeof(unsigned short));
Vainqueur->sauvegarde(fich); //Erreur
neq=tabeq.size();
fich.write((char*) &neq, sizeof(size_t));
for(i=0; i<tabeq.size(); i++)
{
tabeq.at(i)->sauvegarde(fich);
}
for(i=0; i<tabsc.size(); i++)
{
tabsc.at(i).es1->sauvegarde(fich);
tabsc.at(i).es2->sauvegarde(fich);
fich.write((char*) &tabsc.at(i).s1, sizeof(unsigned short));
fich.write((char*) &tabsc.at(i).s2, sizeof(unsigned short));
fich.write((char*) &tabsc.at(i).v1, sizeof(unsigned short));
fich.write((char*) &tabsc.at(i).v2, sizeof(unsigned short));
}
}

void competition::chargement(ifstream &fich)
{
int i;
size_t neq, l;
char *name;
string N;

tabsc.clear();
tabeq.clear();

fich.read((char*) &numCompet, sizeof(unsigned short));
fich.read((char*) &l, sizeof(size_t));
name=new char[l];
fich.read((char*) name, l*sizeof(char));
nom=name;
fich.read((char*) &numDeJeux, sizeof(unsigned short));
equipe *eq=new equipe;
eq->chargement(fich); 
//Vainqueur->set_nom(eq->get_nom());   bug 1 lors de l'appel de set_nom
//Vainqueur->set_num(eq->get_num());	bug 2 lors de l'appel de set_num
//Vainqueur->set_participe(eq->get_participe());	bug 3 lors de l'appel de set_participe
fich.read((char*) &neq, sizeof(size_t));
for(i=0; i<neq; i++)
{
tabeq.resize(i+1);
//	tabeq.at(i)->chargement(fich); bug 4 lors du chargement
}
for(i=0; i<numDeJeux; i++)
{
tabsc.resize(i+1);
tabsc.at(i).es1->chargement(fich);
tabsc.at(i).es2->chargement(fich);
fich.read((char*) &tabsc.at(i).s1, sizeof(unsigned short));
fich.read((char*) &tabsc.at(i).s2, sizeof(unsigned short));
fich.read((char*) &tabsc.at(i).v1, sizeof(unsigned short));
fich.read((char*) &tabsc.at(i).v2, sizeof(unsigned short));
}
}




La classe qui est en agrégation avec compet equipe.h

#ifndef EQUIPE
#define EQUIPE

#include 
#include <string>
#include <fstream>
#include <cstring>

using namespace std;

typedef struct vdn vdn;
struct  vdn
{
int victoire, defaite, nul;
};

class equipe
{
protected :
string nom;
bool participation;
unsigned short num;
vdn statistique;
public :
string get_nom();
short get_num();
bool get_participe();
vdn get_stat();
void set_num(unsigned short);
void set_participe(bool);
void set_nom(string);
void set_stat(int);
void sauvegarde(ofstream &fich);
void chargement(ifstream &fich);
void afficher();
};

#endif 



Et son cpp

# include "equipe.h"


void equipe::set_nom (string N)
{
nom=N; //Bug 1 N à la bonne valeur mais lors de l'affectation de nom le message de violation s'affiche
}
void  equipe::set_num (unsigned short Nu)
{ 
    num=Nu; //Bug 2 idem que bug 1 mais avec num
}
void  equipe::set_participe (bool P)
{

participation=P; //Bug 3 idem que bug 1 mais avec P
}
void equipe::set_stat(int S)
{
if(S==-1)
statistique.defaite++;
if(S==0)
statistique.nul++;
if(S==1)
statistique.victoire++;
if(S==2)
{
statistique.defaite=0;
statistique.nul=0;
statistique.victoire=0;
}
}
short equipe::get_num()
{
return this->num;
}
bool equipe::get_participe()
{
return this->participation;
}
string  equipe::get_nom()
{
return this->nom;
}
vdn equipe::get_stat()
{
return this->statistique;
}
void equipe::afficher()
{
cout<<"L equipe "<<this->nom<<"\t\t n : "<<num<<endl;
if (this->participation==1)
cout<<"Participe aux competitions"<<endl;
else
cout<<"Ne participe pas aux competitions"<<endl;
cout<<"Score : Victoire : "<<statistique.victoire<<"\t Nul : "<<statistique.nul<<"\t Defaite : "<<statistique.defaite<<endl;
}

void equipe::sauvegarde(ofstream &fich)
{
char *name;
int i;
size_t l;

fich.write((char*) &num, sizeof(unsigned short));
name=new char [nom.size()+1];
strcpy (name, nom.c_str());
l=nom.size()+1;
fich.write((char*) &l, sizeof(size_t));
fich.write((char*) name, l*sizeof(char));
fich.write((char*) &participation, sizeof(bool));
fich.write((char*) &statistique, sizeof(statistique));
}


void equipe::chargement(ifstream &fich)
{
size_t l;
int i;
char *name;

fich.read((char*) &num, sizeof(unsigned short)); //Bug 4 même message que bug 1 je pense qu'il refuse d'affecter num
fich.read((char*) &l, sizeof(size_t));
name=new char[l];
fich.read((char*) name, l*sizeof(char));
nom=name;
fich.read((char*) &participation, sizeof(bool));
fich.read((char*) &statistique, sizeof(statistique));
}


Voilà
Merci beaucoup de votre réponse
P.S j'ai pas mis le main ni la 3 classe car le problème n'y est pas lié

2 réponses

Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
120
Bonjour.

Il y a pas mal de maladresses techniques:
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace. Dans un header, c'est vraiment horrible !
- "std:string" au lieu de "const std::string&" en argument (copie inutile)
- Les attributs qui devraient être différenciés des arguments. Ex: nom => _nom
- Le "typedef struct vdn vdn;" qui ne sert à rien (une structure EST une classe en C++, c'est pareil. Seule la visibilité par défaut est différente).
- tab[i] est plus rapide que tab.at(i)
- Tu peux enchainer les écritures.
Ex:
cout<<"L equipe "<<tabsc.at(var).es1->get_nom()<<"\t marque "<<tabsc.at(var).s1<<" but"<<endl;
cout<<"L equipe "<<tabsc.at(var).es2->get_nom()<<"\t marque "<<tabsc.at(var).s2<<" but"<<endl;
cout<<"L equipe "<<tabsc.at(var).es2->get_nom()<<" gagne"<<endl;
cout<<"---------------------------------------------------------"<<endl;

Devient:
std::cout << "L'equipe " << tabsc.at(var).es1->get_nom() << "\t marque " << tabsc.at(var).s1 << " but" << std::endl
          << "L equipe " << tabsc.at(var).es2->get_nom() << "\t marque "<<tabsc.at(var).s2 << " but" << std::endl
          << "L equipe " << tabsc.at(var).es2->get_nom() << " gagne" << std::endl
          << std::setfill ('-') << std::setw (30) << std::endl;

- Y a plein d'autres choses, comme les fonctions trop longues (Une bonne fonction dépasse rarement 50 lignes), les this-> inutiles, les fonctions d'affichage qui devraient prendre en argument un flux et non écrire dans std::cout, les classes qui devraient avoir une majuscule, les cast inutiles, etc... (Je ne vais pas tout lister).

Au niveau de ton bug, as-tu lancé un débugger pour voir le problème exact ? Si ce n'est pas le cas, je t'invite à le faire avant tout autre chose.

Je peux regarder ton code, mais dans ce cas, je vais te demander de faire un zip de tes fichiers, de le mettre sur un serveur (ou sur un site d'échange de fichier), et de mettre le lien ici.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
2
Date d'inscription
dimanche 3 juin 2012
Statut
Membre
Dernière intervention
4 juin 2012

Ok merci je changerais les maladresses mais mon problème ne venait pas de là mais du fait que je ne pouvait pas appeler ma fonction charger depuis une variable equipe qui appartenait à la classe competition. J'ai résolu le problème en utilisant des equipe dynamique et en les affectants à la fin dans mon tableau de pointeur d equipe.