Accueil > Forum > > > > Problème de violation d'écriture
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
|
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
Livres en rapport
|
Derniers Blogs
ETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 0ETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 0 par Philess
L'extensibilité du Team Web Access
Le Web Access (site d'équipe) de Team Foundation Server a été complètement réécrit dans la version 2012 avec pas moins de 400.000 lignes de JavaScript. Ce nouveau modèle a été pensé pour offrir de grandes...
Cliquez pour lire la suite de l'article par Philess SIMULER FACILEMENT L'ENVOI DE MAILSIMULER FACILEMENT L'ENVOI DE MAIL par JeremyJeanson
il m'a été demandé, à plusieurs reprises, comment je faisais pour simuler l'envoi de mail lors de mes démos de Workflow Foundation. Ma solution est plutôt simple : j'utilise la configuration par défaut du SmtpClient et j'oriente les mails vers un dossier ...
Cliquez pour lire la suite de l'article par JeremyJeanson VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES !VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES ! par Patrick Guimonet
Si ce n'est déjà fait (comme plus de 600 personnes déjà), il est encore temps de voter pour le concours TOP 10 des influenceurs SharePoint francophones ! Il est organisé par harmon.ie et accessible ici : http://harmon.ie/top-...
Cliquez pour lire la suite de l'article par Patrick Guimonet [CONF'SHAREPOINT] DERNIER RAPPEL ! :-)[CONF'SHAREPOINT] DERNIER RAPPEL ! :-) par Patrick Guimonet
La Conf'SharePoint en chiffres c'est : 3 jours de SharePoint ! 4 parcours et 60 sessions 17 partenaires représentant toutes les fac...
Cliquez pour lire la suite de l'article par Patrick Guimonet
Forum
PB PACMAN C++PB PACMAN C++ par garfield95
Cliquez pour lire la suite par garfield95
Logiciels
Easy-Planning (4.5.0.11)EASY-PLANNING (4.5.0.11)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté a... Cliquez pour télécharger Easy-Planning CVEasy (3.1.0.51)CVEASY (3.1.0.51)PHMSD-CVEasy est un logiciel d'aide à la rédaction de CV d'une simplicité déconcertante.
PHMSD-C... Cliquez pour télécharger CVEasy LettresFaciles 2011 (8.6.0.31)LETTRESFACILES 2011 (8.6.0.31)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011 sDEVIS-FACTURES vlPRO (8.4.2.62)SDEVIS-FACTURES VLPRO (8.4.2.62)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO Devis-Factures PHMSD (2.1.0.11)DEVIS-FACTURES PHMSD (2.1.0.11)Configuration minimale
Nécessite Windows™ 2000, XP, Windows 7, 8, Vista (Service Pack à... Cliquez pour télécharger Devis-Factures PHMSD
|