OVH Cloud OVH Cloud

pointeur de pointeur

19 réponses
Avatar
PurL
Bonjour,

Ce code ci-dessous est-il correct (sans erreur) ?

CMaClasse **objet;
(*objet) = new CMaClasse;

Merci,

PurL

9 réponses

1 2
Avatar
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é...

PurL

Avatar
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

Avatar
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


Avatar
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


Avatar
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;
};

Avec aussi

TypeNoeud* m_pRacine;

Alors on peut coder l'insertion ainsi :

void Inserer(const T& p_valeur)
{
TypeNoeud** pPointeur= &m_pRacine;

while (*pPointeur != 0)
{
pPointeur= (p_valeur < (*pPointeur)->donnee)
? &((*pPointeur)->pFilsG)
: &((*pPointeur)->pFilsD);
}

*pPointeur= 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);
}

Avec

ClPosition PositionPour(const T& p_valeur)
{
ClPosition pos(m_pRacine);

while (pos.Ptr() != 0)
{
pos.Replacer((p_valeur < pos->donnee)
? pos->pFilsG : pos->pFilsD);
}

return pos;
}

La classe ClPosition est laissée en exercice :-) (mais elle est
dans mon livre évidemment).

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/



Avatar
Yalbrieux
Bonjour,
Comment faites-vous des tableaux de tableaux ?
Yves
Avatar
Fabien LE LEZ
On Fri, 24 Sep 2004 08:50:34 +0200, "Yalbrieux"
:

Comment faites-vous des tableaux de tableaux ?


std::vector <std::vector <Machin> > tableau_de_tableaux;


--
;-)

Avatar
Yalbrieux
Hi :)
Exactement ; d'ailleurs pourquoi faire du C++ quand il y a tant de logiciels
qui répondent au problèmes que l'on se pose :)
Yves
Avatar
kanze
"Yalbrieux" wrote in message
news:<4153d3c9$0$748$...

Exactement ; d'ailleurs pourquoi faire du C++ quand il y a tant de
logiciels qui répondent au problèmes que l'on se pose :)


Ce qui veut dire quoi, exactement ? Sa réponse utilisait std::vector, ce
qui est la façon standard de faire un tableau en C++.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

1 2