Un pti prob ... :s help

Résolu
meksoft002 Messages postés 7 Date d'inscription samedi 27 octobre 2007 Statut Membre Dernière intervention 20 octobre 2009 - 26 déc. 2008 à 17:56
meksoft002 Messages postés 7 Date d'inscription samedi 27 octobre 2007 Statut Membre Dernière intervention 20 octobre 2009 - 28 déc. 2008 à 11:56
Bonjour, c'est ma première participation en vue que vous pourrez resoudre mon problème ..voila...je vouderais mettre en oeuvre un tableau d'objets "personne"
seulement là....quand je sort de ma fonction "créer"...le contenu du tableau s'efface....j'ai essayé à l'interieur de la fonction le tableau contient ce que je lui ai entré....
s'il vous plait si c'est un probleme de variable temporaire ....dites le moi et dites comment le contourner sans rendre la fonction amie

le prog:

#include 
#include <conio.h>
#include <string.h>

class Personne{
char *nom;
char *prenom;
unsigned int age;

public:
Personne();
Personne(char*,char*,unsigned int);
Personne(Personne&amp;);
~Personne();
void affichage();
void modifier();
void clonage (Personne &amp;);
Personne&amp; operator=(Personne&amp;);
int operator==(Personne&amp;);
//friend void creer (Personne *tab,int n);
//friend void afficher (Personne *tab);
};
Personne::Personne(){
nom=NULL;
prenom=NULL;
age=0;
}

Personne::Personne(char *a,char *b,unsigned int c){
nom=new char[20];
strcpy(nom,a);
prenom=new char[20];
strcpy(prenom,b);
age=c;
}

Personne::~Personne(){
nom=NULL;
prenom=NULL;
}

void Personne::affichage(){
cout<<"\n------------------";
cout<<"\nLe nom "<<nom<<"\nLe prenom "<. nom\n<2>. prenom\n<3>. age\n";
cin>>c;
switch(c){
case 1:cout<<"\nVeuillez entrer la nouvelle chaine...";
cin>>chaine;
strcpy(nom,chaine);
break;
case 2:cout<<"\nVeuillez entrer la nouvelle chaine ...";
cin>>chaine;
strcpy(prenom,chaine);
break;
case 3:cout<<"\nVeuillez entrer la nouvelle valeur ...";
cin>>age2;
age=age2;
break;
}
}

Personne&amp; Personne::operator=(Personne&amp; p){
if(this!=&amp;p){
delete nom;
delete prenom;
nom=new char[20];
prenom=new char[20];
clonage(p);

}
return *this;


}

int Personne::operator==(Personne&amp; p){
if(!strcmp(nom,p.nom) &amp;&amp; !strcmp(prenom,p.prenom) &amp;&amp; age==p.age) return 1;
return 0;
}

void Personne::clonage(Personne &amp;p){
strcpy(prenom,p.prenom);
strcpy(nom,p.nom);
age=p.age;
}

void creer(Personne *tab,int n){
tab=new Personne[n];
char *chaine1=new char[20];
char *chaine2=new char[20];
int c;
for(int i=0;i<=n;i++)
{cout <<"\nNom :  ";cin>>chaine1;
cout <<"\nPrenom :  ";cin>>chaine2;
cout <<"\nAge :  ";cin>>c;
(*(tab+i))=Personne (chaine1,chaine2,c);

}
//tab[0].affichage();---->sa marche bien
}


void afficher(Personne *tab,int n){
for(int i=0;i<=n;i++){
(*(tab+i)).affichage();
}
}


void main(){
clrscr();

Personne p1("tow" , "tiw" , 20 );
Personne p2("gj,","hic",41);
p1.affichage();
p2.affichage();
p2.modifier();
p2.affichage();
p2=p1;
p2.affichage();
/*********************************************/
int n=2;
Personne *tab;
creer(tab,n);
(*tab).affichage();
//tab[0].affichage();---->sa ne donne rien :s
getch();
afficher(tab,n);
/*********************************************/
getch();
}
</string.h></conio.h>

4 réponses

nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
27 déc. 2008 à 22:14
salut,

tu veux creer une Personne a partir d'une fonction, OK. Lorsque tu crees un nouveau tableau d'objets Personne tu stocke l'adresse dans une variable tab , seulement cette variable tu la perds et tu perds en meme temps ton espace memoire : Fuite de memoire.

//voici ta fonction reecrite
void creer(Personne **tab,int n)

      *tab=new Personne[n]; 
      char chaine1[20],chaine2[20]; 
      int c; 
      for(int i=0;i<=n;i++) 
      {
         cout <<"\nNom :  ";cin>>chaine1; 
         cout <<"\nPrenom :  ";cin>>chaine2; 
         cout <<"\nAge :  ";cin>>c; 
         (*(*tab)+i)=Personne (chaine1,chaine2,c); 
   }
}

//et dans le main
.
void main()
{
clrscr();

Personne p1("tow" , "tiw" , 20 );
Personne p2("gj,","hic",41);
p1.affichage();
p2.affichage();
p2.modifier();
p2.affichage();
p2=p1;
p2.affichage();
/*********************************************/
int n=2;
Personne *tab;
creer(&tab,n); // <===== ICI
(*tab).affichage();
//tab[0].affichage();---->sa ne donne rien :s
getch();
afficher(tab,n);
/*********************************************/
getch();
//detruire tab
try{delete [] tab;}catch(...){}
}

Bonne continuation
http://liveplayaz.com

je suis heureux de faire partie d'une grande famille ...!
3
meksoft002 Messages postés 7 Date d'inscription samedi 27 octobre 2007 Statut Membre Dernière intervention 20 octobre 2009
26 déc. 2008 à 18:00
Bonjour, c'est ma première participation en vue que vous pourrez resoudre mon problème ..voila...je vouderais mettre en oeuvre un tableau d'objets "personne"
seulement là....quand je sort de ma fonction "créer"...le contenu du tableau s'efface....j'ai essayé à l'interieur de la fonction le tableau contient ce que je lui ai entré....
s'il vous plait si c'est un probleme de variable temporaire ....dites le moi et dites comment le contourner sans rendre la fonction amie

le prog:

#include 
#include <conio.h>
#include <string.h>

class Personne{
char *nom;
char *prenom;
unsigned int age;

public:
Personne();
Personne(char*,char*,unsigned int);
Personne(Personne&);
~Personne();
void affichage();
void modifier();
void clonage (Personne &);
Personne& operator=(Personne&);
int operator==(Personne&);
//friend void creer (Personne *tab,int n);
//friend void afficher (Personne *tab);
};
Personne::Personne(){
nom=NULL;
prenom=NULL;
age=0;
}

Personne::Personne(char *a,char *b,unsigned int c){
nom=new char[20];
strcpy(nom,a);
prenom=new char[20];
strcpy(prenom,b);
age=c;
}

Personne::~Personne(){
nom=NULL;
prenom=NULL;
}

void Personne::affichage(){
cout<<"\n------------------";
cout<<"\nLe nom "<<nom<<"\nLe prenom "<. nom\n<2>. prenom\n<3>. age\n";
cin>>c;
switch(c){
case 1:cout<<"\nVeuillez entrer la nouvelle chaine...";
cin>>chaine;
strcpy(nom,chaine);
break;
case 2:cout<<"\nVeuillez entrer la nouvelle chaine ...";
cin>>chaine;
strcpy(prenom,chaine);
break;
case 3:cout<<"\nVeuillez entrer la nouvelle valeur ...";
cin>>age2;
age=age2;
break;
}
}

Personne& Personne::operator=(Personne& p){
if(this!=&p){
delete nom;
delete prenom;
nom=new char[20];
prenom=new char[20];
clonage(p);

}
return *this;


}

int Personne::operator==(Personne& p){
if(!strcmp(nom,p.nom) && !strcmp(prenom,p.prenom) && age==p.age) return 1;
return 0;
}

void Personne::clonage(Personne &p){
strcpy(prenom,p.prenom);
strcpy(nom,p.nom);
age=p.age;
}

void creer(Personne *tab,int n){
tab=new Personne[n];
char *chaine1=new char[20];
char *chaine2=new char[20];
int c;
for(int i=0;i<=n;i++)
{cout <<"\nNom :  ";cin>>chaine1;
cout <<"\nPrenom :  ";cin>>chaine2;
cout <<"\nAge :  ";cin>>c;
(*(tab+i))=Personne (chaine1,chaine2,c);

}
//tab[0].affichage();---->sa marche bien
}


void afficher(Personne *tab,int n){
for(int i=0;i<=n;i++){
(*(tab+i)).affichage();
}
}


void main(){
clrscr();

Personne p1("tow" , "tiw" , 20 );
Personne p2("gj,","hic",41);
p1.affichage();
p2.affichage();
p2.modifier();
p2.affichage();
p2=p1;
p2.affichage();
/*********************************************/
int n=2;
Personne *tab;
creer(tab,n);
(*tab).affichage();
//tab[0].affichage();---->sa ne donne rien :s
getch();
afficher(tab,n);
/*********************************************/
getch();
}
0
meksoft002 Messages postés 7 Date d'inscription samedi 27 octobre 2007 Statut Membre Dernière intervention 20 octobre 2009
26 déc. 2008 à 19:01
personne pour m'aider??????
0
meksoft002 Messages postés 7 Date d'inscription samedi 27 octobre 2007 Statut Membre Dernière intervention 20 octobre 2009
28 déc. 2008 à 11:56
effectivement......!!  j'ai fait des betises là.!
0
Rejoignez-nous