Liste chainnee
ahlam1
Messages postés
33
Statut
Membre
-
ahlam -
ahlam -
Bonsoir,
il faut que je programme une liste chainnee avec c++,
j fais 2 class :class chainon et class liste
chainon contien les attribut suivant : char *m_mot;
Chainon* suiv;
et la class liste contient les atribut suivant: Chainon * l
je veux ecrire une fonction ajouter une dans la liste des mot (cad une chainne de carractere)
voici ma fct:
Liste Liste::ajouter(Liste ll,char *mott){
Chainon *p=new Chainon(mott,sizeof(mott),1);
Liste q;
q=ll;
if (q.getl()!= NULL)
{
while (q.getl()->getsuiv()!= NULL)
{
q.getl()=q.getl()->getsuiv();
}
;
q.getl()->getsuiv()=p;
return q;
}
else return q ;
}
mais apres la compilation l'erreur suivante apparu: non-lvalue assignment
si quelqu'un peux m'aider je serai tres reconnaissante
il faut que je programme une liste chainnee avec c++,
j fais 2 class :class chainon et class liste
chainon contien les attribut suivant : char *m_mot;
Chainon* suiv;
et la class liste contient les atribut suivant: Chainon * l
je veux ecrire une fonction ajouter une dans la liste des mot (cad une chainne de carractere)
voici ma fct:
Liste Liste::ajouter(Liste ll,char *mott){
Chainon *p=new Chainon(mott,sizeof(mott),1);
Liste q;
q=ll;
if (q.getl()!= NULL)
{
while (q.getl()->getsuiv()!= NULL)
{
q.getl()=q.getl()->getsuiv();
}
;
q.getl()->getsuiv()=p;
return q;
}
else return q ;
}
mais apres la compilation l'erreur suivante apparu: non-lvalue assignment
si quelqu'un peux m'aider je serai tres reconnaissante
A voir également:
- Liste chainnee
- Liste déroulante excel - Guide
- Liste code ascii - Guide
- Liste déroulante en cascade - Guide
- Site dangereux liste - Guide
- Voir liste d'amis facebook - Guide
3 réponses
tout d'abord là je pense que tu pourrais utiliser des chaines String (standard C++) plutot que les chaines style C en char*, ceci t'éviterait certains tracas :
En C, tu n'obtiens pas la longueur d'une chaine c avec sizeof(c), mais avec strlen(c) . Je ne sais pas trop si c'est ce que tu souhaites faire ou non.
Sinon concrètement concernant ton erreur :non-lvalue assignment
quelle ligne de ton code est associée à cette erreur ?
(Elle signifie que tu essayes de donner une valeur à qqchose qui n'est pas une adresse de variable, ex : 3 = 2+5 est invalide et devrait causer la même erreur, ou encore MaFonctionRetournantUnInt = 7 )
En C, tu n'obtiens pas la longueur d'une chaine c avec sizeof(c), mais avec strlen(c) . Je ne sais pas trop si c'est ce que tu souhaites faire ou non.
Sinon concrètement concernant ton erreur :non-lvalue assignment
quelle ligne de ton code est associée à cette erreur ?
(Elle signifie que tu essayes de donner une valeur à qqchose qui n'est pas une adresse de variable, ex : 3 = 2+5 est invalide et devrait causer la même erreur, ou encore MaFonctionRetournantUnInt = 7 )
salut,
la ligne du code associée à cette erreur est :
while (q.getl()->getsuiv()!= NULL)
et aussi la meme erreur pour la ligne:
q.getl()->getsuiv()=p;
Liste Liste::ajouter(Liste ll,char *mott){ //ajouter a la fin de la liste
Chainon *p=new Chainon(mott,sizeof(mott),1);
Liste q;
q=ll;
if (q.getl()!= NULL)
{
while (q.getl()->getsuiv()!= NULL)//ici je parcoure la liste pour
{ //arriver a la fin de la
q.getl()=q.getl()->getsuiv(); //liste
} //
q.getl()->getsuiv()=p;//ici je change les poiteur pour que le dernier element sera le
// nouveau elemen
return q;
}
else return q ;//le else si la liste est vide
};
ok je vai utiliser string, merci
la ligne du code associée à cette erreur est :
while (q.getl()->getsuiv()!= NULL)
et aussi la meme erreur pour la ligne:
q.getl()->getsuiv()=p;
Liste Liste::ajouter(Liste ll,char *mott){ //ajouter a la fin de la liste
Chainon *p=new Chainon(mott,sizeof(mott),1);
Liste q;
q=ll;
if (q.getl()!= NULL)
{
while (q.getl()->getsuiv()!= NULL)//ici je parcoure la liste pour
{ //arriver a la fin de la
q.getl()=q.getl()->getsuiv(); //liste
} //
q.getl()->getsuiv()=p;//ici je change les poiteur pour que le dernier element sera le
// nouveau elemen
return q;
}
else return q ;//le else si la liste est vide
};
ok je vai utiliser string, merci
alors il te montre la ligne du while car l'erreur est dans le corps de la boucle (probablement
q.getl()=q.getl()->getsuiv(); )
. Puis il te précise la même erreur :
q.getl()->getsuiv()=p;
si tu veux que tes fonctions getl() et getsuiv() renvoient une référence, il faut le préciser.
Apparemment elles renvoient une copie ou je ne sais quoi. Comment sont elles définies exactement ?
q.getl()=q.getl()->getsuiv(); )
. Puis il te précise la même erreur :
q.getl()->getsuiv()=p;
si tu veux que tes fonctions getl() et getsuiv() renvoient une référence, il faut le préciser.
Apparemment elles renvoient une copie ou je ne sais quoi. Comment sont elles définies exactement ?
voila mes 2 class:
class Chainon{
public:
Chainon(char *mot,int taille,int nbr_apparition);
char *getmot(){return m_mot;};
int gettaille(){return m_taille;};
int getnbr_apparition(){return m_nbr_apparition;};
Chainon* getsuiv(){return suiv;};
void settnbr_apparition(int nbr_apparition){m_nbr_apparition=nbr_apparition;};
void settaille(int t){m_taille=t;};
void setmot(char *mot){m_mot=mot;};
private:
char *m_mot;
int m_taille;
int m_nbr_apparition;
Chainon* suiv;
};
class Liste{
public:
Liste();
Chainon* getl(){return l;};
void lire_mot(FILE *f,char *mot,int *arret);
Liste ajouter(Liste ll,char *mott);
private:
Chainon * l;//pour parcourir la liste c la tete
};
class Chainon{
public:
Chainon(char *mot,int taille,int nbr_apparition);
char *getmot(){return m_mot;};
int gettaille(){return m_taille;};
int getnbr_apparition(){return m_nbr_apparition;};
Chainon* getsuiv(){return suiv;};
void settnbr_apparition(int nbr_apparition){m_nbr_apparition=nbr_apparition;};
void settaille(int t){m_taille=t;};
void setmot(char *mot){m_mot=mot;};
private:
char *m_mot;
int m_taille;
int m_nbr_apparition;
Chainon* suiv;
};
class Liste{
public:
Liste();
Chainon* getl(){return l;};
void lire_mot(FILE *f,char *mot,int *arret);
Liste ajouter(Liste ll,char *mott);
private:
Chainon * l;//pour parcourir la liste c la tete
};
mmm... je ne suis pas un pro, mais je crois qu'il y a un problème avec le fait de renvoyer des références vers une variable private. Ce n'est pas très propre. Tu devrais plutot créer des fonctions public void setSuiv(Chainon*) et void setl(Chainon*) et les utiliser à ces moments-là.
(mais je ne garantis rien, encore une fois c'est juste une piste)
(mais je ne garantis rien, encore une fois c'est juste une piste)
Hello
Alors en fait j'y ai pensé pendant la nuit, ça me tracassait apparemment ^^
Ma solution résoud le problème, mais le problème n'était pas un truc de private ou comme ça.
L'erreur était plus "basique" que ça.
Tu ne retournes pas un lien vers la variable private de l'objet. Tu retournes juste un nouveau pointeur qui pointe vers le même Chainon, mais tu pensais que ce pointeur "était" la variable private de ton objet, ce qui est incorrect.
Ceci, c'est tout à fait possible, même si la variable est private (mais ce n'est absolument pas propre car ça brise le principe d'encapsulation) :
Chainon** getsuiv(){return &suiv;};
ainsi avec cette fonction, tu retournes un pointeur vers la véritable variable pointeur de l'objet "suiv" .
ensuite tu peux faire (...getsuiv())* = un autre pointeur
et cette ligne change effectivement le pointeur de l'objet.
Alors en fait j'y ai pensé pendant la nuit, ça me tracassait apparemment ^^
Ma solution résoud le problème, mais le problème n'était pas un truc de private ou comme ça.
L'erreur était plus "basique" que ça.
Tu ne retournes pas un lien vers la variable private de l'objet. Tu retournes juste un nouveau pointeur qui pointe vers le même Chainon, mais tu pensais que ce pointeur "était" la variable private de ton objet, ce qui est incorrect.
Ceci, c'est tout à fait possible, même si la variable est private (mais ce n'est absolument pas propre car ça brise le principe d'encapsulation) :
Chainon** getsuiv(){return &suiv;};
ainsi avec cette fonction, tu retournes un pointeur vers la véritable variable pointeur de l'objet "suiv" .
ensuite tu peux faire (...getsuiv())* = un autre pointeur
et cette ligne change effectivement le pointeur de l'objet.
merci,
mais je n'est pas compris votre expliquation et pourquoi vous avez dit de définir getsuiv ainsi :
Chainon** getsuiv(){return &suiv;};
cad getsuiv retourne double pointeur
j défini getsuiv : void getsuiv(chainon * a){suiv=a;}
void setl(chainon * c){l=c;}
et puis getl(q.getl()->getsuiv());
alors il ma pa donner d'erreur de compilation .
mais je n'est pas compris votre expliquation et pourquoi vous avez dit de définir getsuiv ainsi :
Chainon** getsuiv(){return &suiv;};
cad getsuiv retourne double pointeur
j défini getsuiv : void getsuiv(chainon * a){suiv=a;}
void setl(chainon * c){l=c;}
et puis getl(q.getl()->getsuiv());
alors il ma pa donner d'erreur de compilation .