OK, merci pour vos réponses, je me doutait bien que je laissait passer quelques choses ! Le doute s'est installé car mon debugueur (CodeGuard) ne m'a rien signalé...
PurL
Ce code ci-dessous est-il correct (sans erreur) ?
CMaClasse **objet;
(*objet) = new CMaClasse;
OK, merci pour vos réponses, je me doutait bien que je laissait passer
quelques choses !
Le doute s'est installé car mon debugueur (CodeGuard) ne m'a rien signalé...
OK, merci pour vos réponses, je me doutait bien que je laissait passer quelques choses ! Le doute s'est installé car mon debugueur (CodeGuard) ne m'a rien signalé...
PurL
Jean-Marc Bourguet
writes:
Personnellement, je trouve que comme exemple, c'est un peu tiré par les cheveux.
Tire par les cheveux, pas tellement parce que je l'ai deja vu. Mais j'aurais du preciser que ce n'est pas quelque chose que j'emploie (j'ai un template qui fait ce qu'il faut quand j'ai besoin de listes invasives et sinon j'ai std::list).
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
kanze@gabi-soft.fr writes:
Personnellement, je trouve que comme exemple, c'est un peu tiré par les
cheveux.
Tire par les cheveux, pas tellement parce que je l'ai deja vu. Mais
j'aurais du preciser que ce n'est pas quelque chose que j'emploie
(j'ai un template qui fait ce qu'il faut quand j'ai besoin de listes
invasives et sinon j'ai std::list).
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Personnellement, je trouve que comme exemple, c'est un peu tiré par les cheveux.
Tire par les cheveux, pas tellement parce que je l'ai deja vu. Mais j'aurais du preciser que ce n'est pas quelque chose que j'emploie (j'ai un template qui fait ce qu'il faut quand j'ai besoin de listes invasives et sinon j'ai std::list).
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Jean-Marc Bourguet
"Vincent Lascaux" writes:
Liste doublement chainee si on ne veut pas parcourir en arriere: template<typedef T> struct Node { T val; Node<T>* next; Node<T>** prev; }; a moins de cas particulier a tester qu'avoir Node<T>* prev.
Hum... je suis pas sur de comprendre en quoi ca simplifie. Quand tu veux rajouter un noeud, tu alloues une Node, et tu alloues ton pointeur prev pour ensuite lui donner la valeur du noeud précédent ?
Ca remplace des (n->prev != 0) ? n->prev->next : first par *n->prev
(Mais comme j'ai ecrit par ailleurs, je n'utilise pas ca mais je l'ai deja vu).
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
"Vincent Lascaux" <nospam@nospam.org> writes:
Liste doublement chainee si on ne veut pas parcourir en arriere:
template<typedef T>
struct Node {
T val;
Node<T>* next;
Node<T>** prev;
};
a moins de cas particulier a tester qu'avoir Node<T>* prev.
Hum... je suis pas sur de comprendre en quoi ca simplifie. Quand tu veux
rajouter un noeud, tu alloues une Node, et tu alloues ton pointeur prev pour
ensuite lui donner la valeur du noeud précédent ?
Ca remplace des
(n->prev != 0) ? n->prev->next : first
par
*n->prev
(Mais comme j'ai ecrit par ailleurs, je n'utilise pas ca mais je l'ai
deja vu).
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Liste doublement chainee si on ne veut pas parcourir en arriere: template<typedef T> struct Node { T val; Node<T>* next; Node<T>** prev; }; a moins de cas particulier a tester qu'avoir Node<T>* prev.
Hum... je suis pas sur de comprendre en quoi ca simplifie. Quand tu veux rajouter un noeud, tu alloues une Node, et tu alloues ton pointeur prev pour ensuite lui donner la valeur du noeud précédent ?
Ca remplace des (n->prev != 0) ? n->prev->next : first par *n->prev
(Mais comme j'ai ecrit par ailleurs, je n'utilise pas ca mais je l'ai deja vu).
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Pierre Maurette
"PurL" a écrit:
Ce code ci-dessous est-il correct (sans erreur) ?
CMaClasse **objet; (*objet) = new CMaClasse;
OK, merci pour vos réponses, je me doutait bien que je laissait passer quelques choses ! Le doute s'est installé car mon debugueur (CodeGuard) ne m'a rien signalé... CodeGuard n'est pas un débogueur, mais un outil de débogage qui n'a
apparemment pas bonne réputation, mais qui me sert bien. Je l'utilise avec C++ Builder, et il demande quelques précautions d'emploi (dont la lecture de la doc !). Il faut par exemple savoir qu'il intercepte les allocations mémoire, et que malheureusement l'identité de comportement selon qu'on lie ou non CG n'est pas garantie. Il est généralement muet surtout quand le programme est testé dans l'EDI, il faut impérativement consulter le fichier projet.cgl.
Pour tester :
AnsiString ** objet; //objet = new AnsiString*; (*objet) = new AnsiString; EditTest->Text = **objet; //delete (*objet); //delete objet;
(complètement décommenté, AMHA, ce code est valide).
Remarque: j'utilise généralement des trucs comme: typedef AnsiString* pAS; typedef AnsiString** ppAS; -- Pierre
"PurL" <purl-nospam@chez.com> a écrit:
Ce code ci-dessous est-il correct (sans erreur) ?
CMaClasse **objet;
(*objet) = new CMaClasse;
OK, merci pour vos réponses, je me doutait bien que je laissait passer
quelques choses !
Le doute s'est installé car mon debugueur (CodeGuard) ne m'a rien signalé...
CodeGuard n'est pas un débogueur, mais un outil de débogage qui n'a
apparemment pas bonne réputation, mais qui me sert bien. Je l'utilise
avec C++ Builder, et il demande quelques précautions d'emploi (dont la
lecture de la doc !). Il faut par exemple savoir qu'il intercepte les
allocations mémoire, et que malheureusement l'identité de comportement
selon qu'on lie ou non CG n'est pas garantie.
Il est généralement muet surtout quand le programme est testé dans
l'EDI, il faut impérativement consulter le fichier projet.cgl.
Pour tester :
AnsiString ** objet;
//objet = new AnsiString*;
(*objet) = new AnsiString;
EditTest->Text = **objet;
//delete (*objet);
//delete objet;
(complètement décommenté, AMHA, ce code est valide).
Remarque: j'utilise généralement des trucs comme:
typedef AnsiString* pAS;
typedef AnsiString** ppAS;
--
Pierre
OK, merci pour vos réponses, je me doutait bien que je laissait passer quelques choses ! Le doute s'est installé car mon debugueur (CodeGuard) ne m'a rien signalé... CodeGuard n'est pas un débogueur, mais un outil de débogage qui n'a
apparemment pas bonne réputation, mais qui me sert bien. Je l'utilise avec C++ Builder, et il demande quelques précautions d'emploi (dont la lecture de la doc !). Il faut par exemple savoir qu'il intercepte les allocations mémoire, et que malheureusement l'identité de comportement selon qu'on lie ou non CG n'est pas garantie. Il est généralement muet surtout quand le programme est testé dans l'EDI, il faut impérativement consulter le fichier projet.cgl.
Pour tester :
AnsiString ** objet; //objet = new AnsiString*; (*objet) = new AnsiString; EditTest->Text = **objet; //delete (*objet); //delete objet;
(complètement décommenté, AMHA, ce code est valide).
Remarque: j'utilise généralement des trucs comme: typedef AnsiString* pAS; typedef AnsiString** ppAS; -- Pierre
Michel Michaud
Dans news:,
Par curiosité, est ce qu'il existe un cas où il est justifié d'utiliser des pointeurs de pointeurs en C++ ?
quand tu veux un pointeur de pointeur
Ah... bien sur... je suis bête... Au fait, quand est ce que je veux un pointeur de pointeur déjà ?
Un exemple. Supposons dans une classe pour un arbre binaire :
struct TypeNoeud { T donnee; TypeNoeud* pFilsG; TypeNoeud* pFilsD; };
Je ne dis qu'il faut écrire le code comme ça, mais c'est une possibilité intéressante :-)
En fait, dans mon livre sur les structures de données, je fais une classe ClPosition (imbriquée dans ma classe d'arbre) pour isoler et cacher un peu ces pointeurs sur pointeur, ce qui permet de faire ensuite :
void Inserer(const T& p_valeur) { PositionPour(p_valeur)= new TypeNoeud(p_valeur); }
Je ne dis qu'il faut écrire le code comme ça, mais c'est une
possibilité intéressante :-)
En fait, dans mon livre sur les structures de données, je fais
une classe ClPosition (imbriquée dans ma classe d'arbre) pour isoler
et cacher un peu ces pointeurs sur pointeur, ce qui permet de faire
ensuite :
void Inserer(const T& p_valeur)
{
PositionPour(p_valeur)= new TypeNoeud(p_valeur);
}
Je ne dis qu'il faut écrire le code comme ça, mais c'est une possibilité intéressante :-)
En fait, dans mon livre sur les structures de données, je fais une classe ClPosition (imbriquée dans ma classe d'arbre) pour isoler et cacher un peu ces pointeurs sur pointeur, ce qui permet de faire ensuite :
void Inserer(const T& p_valeur) { PositionPour(p_valeur)= new TypeNoeud(p_valeur); }