[STL] Probleme STL : List : Iterator
Bonsoir,
Suite a differrente remarque je me suis mis a la STL et je trouve ca pas mal du tout :)
J'ai donc voulu convertir mon code afin de prendre possesion des avantages de la STL.
Malheureusement... je me vois dans l'incapacitee de debugueer le probleme ici present. L'erreur est un classic "Segmentation fault" et voici une partie de la trace effectuee avec gdb :
Citation:
fillBin (tabBin=0x80c381c, tabSeg=0x80bbe30, tabVertices=0x80bc0c0, nbSeg=162) at visual12.cpp:1393
1393 if(nbDelList<2) // if(delList is not Full)
1: *iter = (Line *&) @0x80bb740: 0x80bf910
(gdb) next
1395 cout<<(*iter)<<"** added to delList["<<nbDelList<<"]."<<endl<<endl;
1: *iter = (Line *&) @0x80bb740: 0x80bf910
(gdb) next
0x80bf910** added to delList[0].
1396 delList[nbDelList]=(*iter);
1: *iter = (Line *&) @0x80bb740: 0x80bf910
(gdb) next
1397 if((*iter)->getActivity()==true)
1: *iter = (Line *&) @0x80bb740: 0x80bf910
(gdb) next
1399 (*iter)->setActivity(false);
1: *iter = (Line *&) @0x80bb740: 0x80bf910
(gdb) next
1400 workingSegments.erase(iter);
1: *iter = (Line *&) @0x80bb740: 0x80bf910
(gdb) next
1401 numWorkingSegments--;
1: *iter = (Line *&) @0x80bb740: 0x80bf910
(gdb) next
1403 nbDelList++;
1: *iter = (Line *&) @0x80bb740: 0x80bf910
(gdb) next
1388 for(iter=workingSegments.begin(); iter!= workingSegments.end(); ++iter)
1: *iter = (Line *&) @0x80bb740: 0x80bf910
(gdb) next
1390 cout<<"Vertices : "<<(*iter)->getPtIni()<<" and "<<(*iter)->getPtFin()<<" belong to WorkingSegment : "<<*iter<<endl;
1: *iter = Disabling display 1 to avoid infinite recursion.
(Line *&) @0x8: Cannot access memory at address 0x8
Voici le code en question :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
if(iVertices>0)
{
cout<<"Current Vertices : "<<vCurrent<<"and alpha = "<<vCurrent->getAngle()<<endl;
for(iter=workingSegments.begin(); iter!= workingSegments.end(); ++iter)
{
cout<<"Vertices : "<<(*iter)->getPtIni()<<" and "<<(*iter)->getPtFin()<<" belong to WorkingSegment : "<<*iter<<endl;
if(((*iter)->getPtIni()==vCurrent) || ((*iter)->getPtFin()==vCurrent))
{
if(nbDelList<2) // if(delList is not Full)
{
cout<<(*iter)<<"** added to delList["<<nbDelList<<"]."<<endl<<endl;
delList[nbDelList]=(*iter);
if((*iter)->getActivity()==true)
{
(*iter)->setActivity(false);
workingSegments.erase(iter);
numWorkingSegments--;
}
nbDelList++;
}
}
} |
Pourquoi donc il n'arrive pas a acceder a la memoire ??? Je suppose que cela vient de l'iterator.. mais ?
Merci encore !
suppression d'un objet dans un vector
Bonjour à tous,
en faite, j'ai un problème concernant les vecteurs de pointeurs,
Dans une méthode "Get_Objects_Coverd_P"
Je fais un parcours sur un vecteur de pointeurs "table" qui sont des objets possedant un nom ,un min et un max. Parmi les objets stockés, je voulais récupérer les objets qui sont inclus dans un objet P bien défini (c'est à dire ,la borne inf d'un objet est >= à lla borne inf de P et la borne sup d'un objet est <= par rapport à P)
les objets retenus sont stockés dans un nouveau vecteur de pointeurs qui s'appelle "Template_Object_Covered_P". et doivent être suuprimés du vecteur "table".
j'ai utilisé erase pour les effacer mais ça fonctionne pas.les objets ne s'effacent pas.
par contre quand j'applique ça dans main sans passer par une méthode ça marche.
A votre avis ,est ce que c'est à cause que je travaille sur des pointeurs???
Aidez moi:(
ci dessous le code :
/*************************************Objets Couverts par P**************************************************************/
vector<Object*> Get_Objects_Coverd_P(vector<Object*>table){
vector<Object*>Template_Object_Covered_P;
Object* OD;
Object* P;
int ind_p;
/***********************************Recherche de l'objet dominant*********************************************************/
OD = table.front();
cout <<"L'objet dominant est : "<<OD ->Get_Name()<<endl;
/***************************************Recherche d'un objet en intersection partielle avec l'objet dominant**************/
P = Get_P(table); // P est déjà calculé
/*************************Recherche des objets couverts par l'objet P ****************************************************/
if(P!=NULL){
/**************************On cherche dans la liste initiale**************************************************************/
Template_Object_Covered_P.clear();
for(ind_p=1;ind_p<table.size();ind_p++){
if((table[ind_p]->Get_Min()>=P->Get_Min())&&(table[ind_p]->Get_Max()<=P->Get_Max())){
Template_Object_Covered_P.push_back(table[ind_p]);
table.erase(table.begin()+ind_p); // Le problème est ici
ind_p--;
}
}
return Template_Object_Covered_P;
}
}
/******************************************************MAIN********************************************************/
int main()
{
char fileName [LGMAX_FILE_NAME + 1] ;
string name;
int min, max;
bool istemplate;
int nb_objects=0;
int i;
string Z_String ;
vector<Object*> table_objects;
vector<Object*> objects_covered_P;
/**************Lecture des informations dans le fichier qui contient les noms des objets leurs Xmin et leurs Xmax************/
cout << "name of the file : " ;
cin >> setw (LGMAX_FILE_NAME) >> fileName ;
ifstream entree (fileName, ios::in|ios::binary) ; // ou ios::in
if (!entree) { cout << "Error: can not open the file " << fileName <<endl ;
exit (-1) ;
}
while(!entree.eof())
{
entree >> name;
entree >> min;
entree >> max;
if(name == "*") break;
else
cout << "name: " << name << " min: " << min << " max: " << max << endl ;
table_objects.push_back(new Object(name,min,max,false));
nb_objects++;
}
entree.close () ;
cout << "**************************************************************\n";
cout << " Voici les noms, les min, les max des objets de votre image \n";
cout << "**************************************************************\n";
cout << "Nb objects: " << nb_objects << endl;
for(i= 0; i< nb_objects;i++){
cout<<table_objects[i]->Get_Name()<<"\t"<<table_objects[i]->Get_Min()<<"\t"<<table_objects[i]->Get_Max()<<"\n";
}
cout << "Taille du vecteur d'objets: " << table_objects.size()<<"\n";
objects_covered_P = Get_Objects_Coverd_P(table_objects);
cout<<"les objets couverts par P sont :"<<endl;
for(int y=0;y<objects_covered_P.size();y++)
cout<<objects_covered_P[y]->Get_Name()<<"\t";
cout<<endl;
/*for(int z=0;z<table_objects.size();z++){
table_objects.erase(table_objects.begin()+z);
z--;
}
cout<<endl;*/
cout<<"Table Objects contient :"<<endl;
for(int k=0;k<table_objects.size();k++)
cout<<table_objects[k]->Get_Name()<<"\t";
cout<<endl;
}