begin process at 2013 05 25 15:50:08
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Problème de violation d'écriture


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème de violation d'écriture

dimanche 3 juin 2012 à 22:09:03 | Problème de violation d'écriture

genialo3000

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
Code C/C++ :
#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
Code C/C++ :
# 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

Code C/C++ :
#ifndef EQUIPE
#define EQUIPE

#include <iostream>
#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

Code C/C++ :
# 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é
lundi 4 juin 2012 à 11:00:27 | Re : Probleme de violation d'écroture

CptPingu

Administrateur CodeS-SourceS
Bonjour.

Il y a pas mal de maladresses techniques:
- Évite les "using namespace", voir: [ Lien ]. 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 est plus rapide que tab.at(i)
- Tu peux enchainer les écritures.
Ex:
Code C/C++ :
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:
Code C/C++ :
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
Merci d'utiliser [i]Réponse acceptée
si un post répond à votre question
lundi 4 juin 2012 à 12:24:16 | Re : Problème de violation d'écriture

genialo3000

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.


Cette discussion est classée dans : char, get, sizeof, short, fich


Répondre à ce message

Sujets en rapport avec ce message

PROBLEME POINTEURS [ par zeloveur ] char * saisirChaine(){ int i=0; char *chn; chn=(char *)malloc(sizeof(char)); do { chn[i]=getchar(); chn=(char *)realloc(chn,(++i+1)*sizeof(char)); } taille chaine de char [ par langedechu ] Salut , voila mon prob (je sais plus comment faire) :j'ai une variable : const char *buffer; et j aimerais savoir le nombre de caractere stocker dans pb avec conio je cher cherche l'erreur( j'ai merde sur le mess precedent) [ par kin ] portpia.cpp#include"PortPiaPc.h"void main(){ PortPiaPc inst; inst(0x320,0x0f);}PortPiaPc.cpp#include "PortPiaPc.h"#include "conio.h"PortPiaPc::PortPia Convertir un type char (contenant bien sur un nombre) en short? [ par houssadotcom ] Bonjour, tout est dans le titre.J'ai un tableau de type char contenant par exemple la valeur '123', et je voudrais en faire un short.Comment faire ?Me Convertir un type char (contenant bien sur un nombre) en short? [ par houssadotcom ] Bonjour, tout est dans le titre.J'ai un tableau de type char contenant par exemple la valeur '123', et je voudrais en faire un short.Comment faire ?Me Sniffing - raw socket [ par krum ] J'ai essayé de coder un programme capable de me donner la description de l'en tete IP et TCP des packets que je reçois d'une certaine IP,mais lorsque debutant en c, probleme pour un programmme de compression [ par araborgne ] voila donc je cherchais un programme permettant de compresser et decompresser un fichier texte, et image.j'en ai trouver un, mais il est ecrit en c++, Conversion unsigned short ---> char * [ par nemmezis ] Salut tout le monde,Ben tout est dit dans le titre; j'ai en fait besoin de convertir un unsigned short en char* afin de pouvoir le concaténer dans un portabilité du C hoop c BIDON [ par louatiamin ] g un e kestion ki necessite un peu de "profissionalisme" (en tt k mal redigé )mai ma kestion est la suivante:en parlant du C (langage) on dirai la por Pb affichage bmp envga c/asm [ par 030417 ] Bonjour à tous,Je suis en train d'essayer d'afficher un bmp en c avec asm sous dos en vga (13h) . j'utilise comme compilateur borland c++ 3.0, mais je


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,122 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales