Liste chainée

foufidou Messages postés 156 Date d'inscription mardi 31 août 2004 Statut Membre Dernière intervention 21 mai 2015 - 11 déc. 2005 à 16:58
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011 - 12 déc. 2005 à 07:28
salu tout le monde,
je travail sur un projet qui est uen mediatheque (cd + video + livre) biensur c en liste chainé c a dir ke j'ai une liste ki contient elle meme 3 liste chainé pour chacune des categories ( cd ou livre ou video).
j'ai creer 1 class pour chaque categorie ensuite dans la class de ma boite de dialog principale g declaré une structure ki contien des pointeur ki pointe sur chaque liste :

typedef struct LChaine
{
cd *PointeurCD;
livre *Pointeurlivre;
video *Pointeurvideo;
LChaine *Pointeurliste;
}liste;


static liste *gou;
dans cette meme class g fait une allocation memoire pour cette liste

BOOL CMediathequeDlg::OnInitDialog()
{
gou=(liste*)malloc(sizeof(liste));
gou->PointeurCD->auteur="blabla";
gou->Pointeurliste=NULL;

returne true;
}
cette allocation me genre une defaillance c'est que je croit l'allocation est plutot fausse malgré que ca parait etre vrai mais je c pa pkoi ca marche pa.
mon 2eme probleme c que g dautre boite de dialogue par example pour lajout d un livre ou un cd et je voudrai ke ces autres class reconnaissent la structure que je vient de declacré dans la boite de dialogue principale pour pouvoire ajouté les different article dans ma liste chainé !!

merci pour votre aide .

3 réponses

NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
11 déc. 2005 à 20:50
c'est pas ton allocation qui n'est pas bonne, c'est ton:

gou->PointeurCD->auteur="blabla"; // n'oublie pas que ton ->PointeurCD est un pointeur



il te faut donc une allocation pour chaque item(sauf le ->Pointeurliste)



///////////////////////////////////////////////

gou = new liste; // tu es en C++ alors utilise new/delete, pas malloc()/free() ...



//

// new/delete font appels aux constructeurs/destructeurs des objets

// malloc()/free() ne le font pas ! c'est dangeureux ! alors utilise new/delete

//



//

// ->PointeurCD est un pointeur sur un objet de type « cd »

// il faut donc lui assigner un espace mémoire( nouvel objet de type « cd » )

//

gou->PointeurCD = new cd;

gou->PointeurCD->auteur = "xyz"; // c'est quoi « ->auteur » ? quel type?



gou->Pointeurliste = NULL; // pas de suivant ...

gou->Pointeurlivre = NULL; // c'est pas un livre

gou->Pointeurvideo = NULL; // et ce n'est pas un video

///////////////////////////////////////////////



ta variable globale « gou » ne doit pas être static

si tu la mise dans un .cpp, elle serat donc locale/privée/... a ton .cpp



tu pourrais la déclarer de cette facon(dans ton .cpp):



///////////////////////////////////

liste * gou;

///////////////////////////////////



et ensuite, dans les autres fichiers .cpp où tu en as besoin, tu mets:



/////////////////////////////////////

extern liste * gou;

///////////////////////////////////// « extern » indique que la ressource(gou) demandée est externe au fichier courant



et puis tu peux ensuite l'utiliser ...



en C++ tu pourrais faire quelque chose de plus propre(plus C++/OO)

mais moins simple, ca serait quand même mieux que la méthode précédente ...










~(.:: NitRic ::.)~
0
foufidou Messages postés 156 Date d'inscription mardi 31 août 2004 Statut Membre Dernière intervention 21 mai 2015
11 déc. 2005 à 23:52
avant tous merci de ton attention,
le probleme NitRic c que lorske j'ecri "gou" et ke je fai "->" il ne me sort pas la liste des pointeur dans ma structure (PointeurCD...) malgré ke je declaré comme pointeur comme tu me la corrigé "liste * gou" au lieu de "static liste * gou". il les sort seulment kan je fai "." apré "gou"
j'ai ecrit ca dans le initDialog de ma boite de dialogue principale :

BOOL CMediathequeDlg::OnInitDialog()
{

CDialog::OnInitDialog();


// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here
gou->PointeurCD = new cd;
gou->PointeurVideo = new video;
gou->PointeurLivre = new livre;
gou->Pointeurliste = NULL;
return TRUE; // return TRUE unless you set the focus to a control
}

lors de la compilation aucune faute, mai apré dans le CMediathequeDlg lorske je fai appel a mes PointeurCD, PointeurVideo et PointeurLivre il ne les connai pa.
et pour le "extern liste * gou" ca donne une erreur de compilation du type :
1/missing ";" befor "*"
2/undeclared identifier
3/illigal indirection
malgré que jai fai mon #include "MediathequeDlg.h" dans le cpp ou g mi "extern..."
0
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
12 déc. 2005 à 07:28
j'ai pas vraiment tout compris mais, pour ce qui est de ton -> et le
.(point), c'est l'éditeur ca, faut pas trop se 'fier' a ca ...

ton « liste * gou » si tu l'utilise seulement dans ton « CMediathequeDlg », ajoute un attribue a ta classe



class CMediathequeDlg

{

public:

//...

private:

liste * gou;

//...

};



et dans ton « ::OnInitDialog() », je ne vois aucun « gou = new liste; » ... « gou » est un pointeur alors un new ...



pour les erreurs avec le « extern liste * gou; » vérifie que tu as bien
mit ton « gou » en global(hors de toute classe/struct/...) ...

tu mets ca dans le haut d'un fichier .cpp(après les #include par
exemple) et puis dans les autres fichiers .cpp, la tu mets le « extern
liste * gou; » ... sinon, comme j'ai dit plus haut, tu peux mettre ca
dans ta classe « CMediathequeDlg » et même ajouter une méthode pour y
acceder:



class CMediathequeDlg

{

public:

//...

liste * get_gou() const

{

return this->gou;

}

//...

private:

liste * gou;

//...

};


etc...

etc...

etc...








~(.:: NitRic ::.)~
0
Rejoignez-nous