[C++] problème de list : erase & insert

Résolu/Fermé
fDS - 10 sept. 2012 à 23:48
 fDS - 11 sept. 2012 à 00:06
Bonjour,

J'aimerai que l'on m'éclaire enfin sur mon problème dans l'une des fonctions de mon programme.

J'ai un programme, qui contient un menu graphique, que l'on utilise avec le clavier, mais là n'est pas le problème.
Le problème, est que j'ai une fonction qui sert a modifier une ligne du menu, et chaque ligne du menu est stocké dans une list pour pouvoir etre manipulé plus facilement, notamment pour effacer et insérer au milieu de la liste.
La fonction nommée setText recoit en paramètre le nouveau texte, et la position dans la liste.
J'utilise bien sûr les itérateurs, pas de souci, mais quand j'utilise la fonction erase, la ligne s'efface bien, mais je dois ensuite insérer la nouvelle ligne de type menuElement avec insert, et là, c'est le drame! Ca ne fonctionne pas ou très mal car je ne comprend pas comment ça fonctionne malgré avoir lu la doc et les exemples. Moi ça plante, segmentation fault.

Expliquez-moi pourquoi et comment y remediez!


void Menu::setText(string newText, int currentIndex){
    //Effacer le menu element du vecteur, en partant du début + la position suppose.
    list<menuElement>::iterator it = m_menuElementList.begin();
    advance(it, currentIndex);
    m_menuElementList.erase(it);
    menuElement m_el;
    //Génére la surfaceHover
    m_el.surfaceHover = Surface::surfacePolice(this->m_fontPath, this->m_fontSize, newText, this->m_colorHover);
    //Génére la surfaceNormal
    m_el.surfaceNormal = Surface::surfacePolice(this->m_fontPath, this->m_fontSize, newText, this->m_colorNormal);
    //ajoute a la liste au bon endroit
    this->m_menuElementList.insert(it, m_el);

}
A voir également:

1 réponse

Bon,
finalement, a force de chercher a comprendre, ça finit enfin par marché!

Plus besoin de m'aider mais je donne quand même la solution à la communauté.

La solution était que je devais repositionner correctement l'itérateur it à l'endroit que je voulais inséré.
Je croyais d'après les exemples de la doc, que je n'avais pas besoin de repositionné l'itérateur pour insérer mais je me serais trompé.
J'ai ensuite pensé qu'en faisant --it; avant d'insérer allait fonctionner, mais cela marchait pas vraiment bien.
Puis j'ai tout simplement repris mes premières lignes de ma fonction, à savoir placer l'itérateur au début, puis l'avancer jusqu'a la position voulu. ET CA MARCHE !!!

Voilà le nouveau code qui fonctionne désormais :
void Menu::setText(string newText, int currentIndex){
    //Effacer le menu element du vecteur, en partant du début + la position suppose.
    list<menuElement>::iterator it = m_menuElementList.begin();
    advance(it, currentIndex);
    m_menuElementList.erase(it);
    //*****Modif qui fonctionne
    it = m_menuElementList.begin();
    advance(it, currentIndex);
    //*****
    menuElement m_el;
    //Génére la surfaceHover
    m_el.surfaceHover = Surface::surfacePolice(this->m_fontPath, this->m_fontSize, newText, this->m_colorHover);
    //Génére la surfaceNormal
    m_el.surfaceNormal = Surface::surfacePolice(this->m_fontPath, this->m_fontSize, newText, this->m_colorNormal);
    //ajoute a la liste au bon endroit
    this->m_menuElementList.insert(it, m_el);

}


Si vous avez des moyens pour optimiser ce code, n'hésitez pas de le faire remarqué.
0