Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [Résolu]vector + pointeur invalide après un push_back + à cause de vertexArray ?  (Lu 1930 fois)

0 Membres et 1 Invité sur ce sujet

DrPapino

  • Newbie
  • *
  • Messages: 34
    • Voir le profil
Bonjour,

Je code un petit HalfEdge. Voilà un code minimal :

#include <iostream>
#include <SFML/Graphics.hpp>

struct HalfEdge
{
    int x;
    int y;
    HalfEdge* next;
};

int main()
{
    std::vector<HalfEdge> m;
   
    m.resize(6);
   
    const int width = 600;
    const int height = 400;
   
    m[0] = {50,50,&m[1]};
    m[1] = {width,50,&m[2]};
    m[2] = {50,height,&m[0]};
    m[3] = {50,height,&m[4]};
    m[4] = {width,50,&m[5]};
    m[5] = {width,height,&m[3]};
   
    m.push_back({100,100,&m[0]});
   
    sf::VertexArray vertexArray(sf::Lines);
   
    for (unsigned i=0; i<m.size(); i++)
    {
        std::cout << m[i].x << "," << m[i].y << "," << m[i].next->x << "," << m[i].next->y << std::endl;
       
        vertexArray.append({sf::Vector2f(m[i].x,m[i].y),sf::Color(250,250,250,50)});
        vertexArray.append({sf::Vector2f(m[i].next->x,m[i].next->y),sf::Color(250,250,250,10)});
    }
   
    sf::RenderWindow window(sf::VideoMode(800,600), "SFML window");
   
    sf::Event event;
   
    while (window.isOpen())
    {
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
                window.close();
        }
       
        window.clear();
       
        window.draw(vertexArray);
       
        window.display();
    }
     
    return 0;
}
 

J'observe un comportement plutôt étrange : quand je n'ajoute pas les points à vertexArray, l'output est le suivant (tout bon)
50,50,600,50
600,50,50,400
50,400,50,50
50,400,600,50
600,50,600,400
600,400,50,400
100,100,50,50
Alors que quand je les ajoute, ça part en cacahuète :
50,50,600,50
600,50,50,400
50,400,1112014848,1112014848
50,400,0,184220410
600,50,0,1073741824
600,400,855309050,0
100,100,0,1073741824

Est ce un problème de la SFML ou du vector, je ne sais pas trop. Mais ça me dérange :P Quelqu'un a déjà eu ce problème ?
« Modifié: Septembre 15, 2015, 10:49:19 am par DrPapino »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : vector + pointeur invalide après un push_back + à cause de vertexArray ?
« Réponse #1 le: Septembre 15, 2015, 10:46:36 am »
Lorsque tu utilises push_back, le vector aura peut-être besoin d'allouer sa mémoire ailleurs pour grandir, invalidant par la même occasion tous les pointeurs vers d'autres éléments que tu avais précédemment stockés (dans le champ "next"). Utilise des indices plutôt que des pointeurs, si tu veux éviter ce problème. Ou bien donne directement sa taille finale au vector (avec resize ou reserve) si tu le peux. Ou bien utilise std::list.
Laurent Gomila - SFML developer

DrPapino

  • Newbie
  • *
  • Messages: 34
    • Voir le profil
Re : vector + pointeur invalide après un push_back + à cause de vertexArray ?
« Réponse #2 le: Septembre 15, 2015, 10:48:54 am »
Merci de ton explication, Laurent. J'avais peur justement qu'avec le push_back le vector ne soit "déplacé" en mémoire, pour les raisons que tu dis. Je vais plutôt mettre des indices, du coup :)

Encore merci !

 

anything