C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

iterator, pointeur...

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Nicolas Aunai
Guest





PostPosted: Wed Feb 11, 2004 2:49 pm    Post subject: iterator, pointeur... Reply with quote



salut,

j'ai un petit programme qui plante, je pense que le plantage vient d'un
truc que je fais mal avec un iterator.

voici mon problème.

soit un objet A constitué :
d'une relation d'ordre.
d'une donnée caractéristique.
d'un tableau de pointeur sur d'autres objets A.

soit un tableau d'objets A.

chaque objet A du tableau, à son tableau constitué de pointeurs sur les
autres objets A (ses voisins), triés selon la relation d'ordre.

A possède entre autres les méthodes suivantes :
MiseAJour, chargée de mettre a jour la liste de pointeurs sur les
voisins de l'objet.
maj, fonction statique mettant a jour tous les objets d'un tableau.


pour illustrer ça, je fais un exemple avec un objet MaString :

class MaString
{
public:
string s; //donnée caractéristique
vector<const MaString *> tab; //liste des voisins

MaString(const string &str, const vector<MaString> & t);
void MiseAJour(const vector<MaString> &t);
static void maj(vector<MaString> &t);
bool operator<(const MaString &ms) const; // relation d'ordre
friend ostream & operator<<(ostream &os,const MaString &ms);
};


voici la définition de la méthode de mise a jour des voisins :


void
MaString::MiseAJour(const vector {
vector<MaString>::const_iterator iter_t = t.begin();
vector<const MaString*>::iterator iter_tab = tab.begin();

while(iter_t != t.end())
{
cout << "DEBUT WHILE" << endl;

if(&*iter_t != this)
{
cout << "&ITER_T!= THIS" << endl;

if(iter_tab == tab.begin())
{
cout << "ITER_TAB == TAB.BEGIN()" << endl;
tab.push_back(&*iter_t);
iter_tab ++;
}
else
{
cout << "ITER_TAB != TAB.BEGIN()" << endl;
if(**(iter_tab-1) < *iter_t) //ICI PLANTAGE
{
cout << "**ITER_TAB < *ITER_T" << endl;
tab.push_back(&*iter_t);
iter_tab ++;
}
else
{
cout << "**ITER_TAB > *ITER_T" << endl;
tab.insert(iter_tab,&*iter_t);
iter_tab ++;
}
}
}
iter_t ++;
}
}


et voici l'affichage que j'ai à l'execution :

DEBUT WHILE
DEBUT WHILE
&ITER_T!= THIS
ITER_TAB == TAB.BEGIN()
DEBUT WHILE
&ITER_T!= THIS
ITER_TAB != TAB.BEGIN()

puis plantage...

le plantage se trouve donc à l'endroit que j'ai commenté "ICI PLANTAGE"
cependant je ne comprends pas pourquoi.


en effet, le premier passage dans la boucle ne fais qu'incrémenter
l'indice dans le tableau 't' car sa première case EST l'objet MaString
(il peut pas etre son propre voisin)

dans le second passage, iter_t à bien été incrémenté, et iter_tab est
toujours au début du tableau de voisin donc on ajoute l'adresse du
voisin dans la première case.
on incrémente ensuite iter_tab
puis on incrémente iter_t

troisième passage dans la boucle
l'adresse est toujours différente de la notre, on continue, iter_tab a
bien été incrémenté, là on regarde la relation d'ordre entre le voisin
présent a la case d'avant et le voisin qu'on veut ajouter, pour savoir
si on doit l'ajouter avant ou après.
c'est pour ça que je fais :

if(**(iter_tab-1) < *iter_t)

c'est ce que j'aurai fait avec des pointeurs, mais avec des iterator...
ça n'a pas l'air de marcher...

j'ai essayé de faire :

if(**(iter_tab-sizeof(MaString*)) < *iter_t)

mais ça plante tout pareil...

si vous voyez où se trouve l'erreur, moi je sèche...

--
Nico,
http://astrosurf.com/nicoastro
messenger : [email]nicolas_aunai (AT) hotmail (DOT) com[/email]

Back to top
Franck Branjonneau
Guest





PostPosted: Wed Feb 11, 2004 7:22 pm    Post subject: Re: iterator, pointeur... Reply with quote



Nicolas Aunai <nicolas.aunai (AT) free (DOT) fr> écrivait:

Quote:
salut,

Bonjour,

Quote:
j'ai un petit programme qui plante, je pense que le plantage vient
d'un truc que je fais mal avec un iterator.

Mais peur-être pas...

Quote:
voici mon problème.
[ Peu clair ]

pour illustrer ça, je fais un exemple avec un objet MaString :

class MaString
{
public:
string s; //donnée caractéristique
vector<const MaString *> tab; //liste des voisins

MaString(const string &str, const vector<MaString> & t);

Plutôt MaString(const std::string & str, const std::vector< MaString * > & t) ?
^^^

Quote:
void MiseAJour(const vector<MaString> &t);
static void maj(vector<MaString> &t);
bool operator<(const MaString &ms) const; // relation d'ordre
friend ostream & operator<<(ostream &os,const MaString &ms);
};


voici la définition de la méthode de mise a jour des voisins :


void
MaString::MiseAJour(const vector {
vector<MaString>::const_iterator iter_t = t.begin();
vector<const MaString*>::iterator iter_tab = tab.begin();

while(iter_t != t.end())
{
cout << "DEBUT WHILE" << endl;

if(&*iter_t != this)
{
cout << "&ITER_T!= THIS" << endl;

if(iter_tab == tab.begin())
{
cout << "ITER_TAB == TAB.BEGIN()" << endl;
tab.push_back(&*iter_t);
iter_tab ++;
}
else
{
cout << "ITER_TAB != TAB.BEGIN()" << endl;
if(**(iter_tab-1) < *iter_t) //ICI PLANTAGE

Mais encore ? En pariculier, est-ce que MyString::operator< est bien
défini ?

Quote:
{
cout << "**ITER_TAB < *ITER_T" << endl;
tab.push_back(&*iter_t);
iter_tab ++;
}
else
{
cout << "**ITER_TAB > *ITER_T" << endl;
tab.insert(iter_tab,&*iter_t);
iter_tab ++;
}
}
}
iter_t ++;
}
}

--
Franck Branjonneau
Back to top
Nicolas Aunai
Guest





PostPosted: Wed Feb 11, 2004 7:29 pm    Post subject: Re: iterator, pointeur... Reply with quote



Franck Branjonneau a écrit :


Quote:
MaString(const string &str, const vector<MaString> & t);

Plutôt MaString(const std::string & str, const std::vector< MaString * > & t)
? ^^^

euh oui...


Quote:
cout << "ITER_TAB != TAB.BEGIN()" << endl;
if(**(iter_tab-1) < *iter_t) //ICI PLANTAGE

Mais encore ? En pariculier, est-ce que MyString::operator< est bien
défini ?

oui oui il l'est.

en fait l'erreur devait venir du push_back, qui réallouait la mémoire,
les iterator n'étaient plus valides. j'utilise des indices à présent
c'est plus sûr.

--
Nico,
http://astrosurf.com/nicoastro
messenger : [email]nicolas_aunai (AT) hotmail (DOT) com[/email]


Back to top
Nicolas Aunai
Guest





PostPosted: Wed Feb 11, 2004 7:32 pm    Post subject: Re: iterator, pointeur... Reply with quote

Nicolas Aunai a exposé le 11/02/2004 :
Quote:
Franck Branjonneau a écrit :


MaString(const string &str, const vector<MaString> & t);

Plutôt MaString(const std::string & str, const std::vector< MaString * > &
t) ?
^^^

euh oui...


euh en fait non non !! Smile 't' est le tableau d'objets principal qui
contient l'objet courant et ses voisins

--
Nico,
http://astrosurf.com/nicoastro
messenger : [email]nicolas_aunai (AT) hotmail (DOT) com[/email]


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.