Merci beaucoup pour tes réponses claires sur le sujet. En effet, je suis encore débutant, et j'ai toujours un peu de mal à assimiler certains concepts.
Donc a priori, moralité, ne pas s'amuser avec des adresses lorsqu'on a des pointeurs intelligents. J'ai refait ma méthode Ajouter, toute simple, en utilisant la méthode Ajouter, qui est définie dans la classe mère de ListeTriee.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| template <typename INDICE, typename TYPE>
void ListeTriee<INDICE,TYPE>::Ajouter(INDICE Indice, boost::shared_ptr<TYPE> Element)
{
boost::shared_ptr<INDICE> IndicePtr(new INDICE);
*IndicePtr = Indice;
Liste<TYPE>::Ajouter(Element,FIN);
Indices->Ajouter(IndicePtr, FIN);
int cpt = Taille-1;
while (cpt >= 0 && cpt < Taille)
{ // si l'indice n° cpt a une valeur supérieure à l'indice n° cpt+1
if (*(Indices->GetIndice(cpt)) > *(Indices->GetIndice(cpt+1)) )
{ // Alors on échange les valeurs des indices et les valeurs des éléments correspondants.
Indices->GetIndice(cpt).swap( Indices->TableauDeReference[cpt+1] );
this->TableauDeReference[cpt].swap( this->TableauDeReference[cpt+1] );
}
else
{ // Si ce n'est pas le cas, c'est que le tri est fini ; on sort de la boucle.
break;
}
// Puis c'est reparti pour un tour.
--cpt;
}
// La taille de notre liste est donc bien égale à Taille+1 maintenant.
++Taille;
} |
Et a priori, les lignes ci-dessous donnent un SIGABRT :
1 2 3
| boost::shared_ptr<INDICE> IndicePtr(new INDICE);
*IndicePtr = Indice;
Indices->Ajouter(IndicePtr, FIN); |
où Indices est un membre de ListeTriee de type :
boost::shared_ptr<Liste<INDICE> > Indices;
Merci pour tous tes conseils, je vais encore retravailler la suite, celle qui contient les swaps ; si quelqu'un voit ce qui ne va pas dans cet enchaînement... 
Merci !
Partager