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

Auteur Sujet: SIGSEGV  (Lu 3259 fois)

0 Membres et 1 Invité sur ce sujet

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
SIGSEGV
« le: Septembre 02, 2015, 02:16:35 pm »
Hello !
Je teste mon petit programme de jeu en 2d iso, et... vous l'aurez deviné, ça marche pas.
Voici mon erreur:
error: no matching function for call to 'sf::Mouse::getPosition(MainMap*)'
                     sf::Vector2i mousePos = sf::Mouse::getPosition(this);
                                                                        ^
Et mon code:
sf::Event e;
            while (this->pollEvent(e)) {
                if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) {
                    sf::Vector2i mousePos = sf::Mouse::getPosition(this);
                    perso.startMoving(mousePos.x, mousePos.y);
                }
            }
this est un MainMap qui hérite de QSfmlCanvas qui hérite de renderwindow et de qwidget.
Merci de votre aide
« Modifié: Septembre 02, 2015, 05:36:44 pm par S66 »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : sf::RenderWindow dérivée
« Réponse #1 le: Septembre 02, 2015, 02:23:59 pm »
*this, puisque la fonction veut une référence et non un pointeur.
Laurent Gomila - SFML developer

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : sf::RenderWindow dérivée
« Réponse #2 le: Septembre 02, 2015, 04:55:08 pm »
C'était si simple.
Merci.

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : SIGSEGV
« Réponse #3 le: Septembre 02, 2015, 05:41:29 pm »
Nouveau problème ! (Je vais pas créer de nouveau sujet quand même)
J'ai mon programme qui a planté à cause d'un SIGSEGV. What's the problem ?
Voici mon code (pas optimisé du tout):
(click to show/hide)
Je vois vraiment pas quel  problème de pointeur je pourrai avoir...
Merci de votre aide
« Modifié: Septembre 03, 2015, 12:46:20 pm par S66 »

victorlevasseur

  • Full Member
  • ***
  • Messages: 206
    • Voir le profil
Re : SIGSEGV
« Réponse #4 le: Septembre 02, 2015, 05:57:03 pm »
Tu peux utiliser un débuggeur pour voir où ça plante (ou utiliser la fonction de debuggage to Code::Block si tu l'utilises).

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : SIGSEGV
« Réponse #5 le: Septembre 02, 2015, 05:59:23 pm »
Citer
Je vais pas créer de nouveau sujet quand même
Si, puisque ça n'a rien à voir avec le premier problème. Un forum est efficace quand les sujets sont bien organisés ; si on commence à tout mélanger ça devient vite le foutoire.

Sinon pour ta question : oui, utilise le debugger, c'est fait très exactement pour ça.
Laurent Gomila - SFML developer

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : SIGSEGV
« Réponse #6 le: Septembre 02, 2015, 06:25:06 pm »
Le debugger m'indique la ligne 120 du fichier new_allocator.h

#if __cplusplus >= 201103L
      template<typename _Up, typename... _Args>
        void
        construct(_Up* __p, _Args&&... __args)
        { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); } //Ligne 120

      template<typename _Up>
        void
        destroy(_Up* __p) { __p->~_Up(); }
#else
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // 402. wrong new expression in [some_] allocator::construct
      void
      construct(pointer __p, const _Tp& __val)
      { ::new((void *)__p) _Tp(__val); }

      void
      destroy(pointer __p) { __p->~_Tp(); }
#endif

Et j'utilise Qt.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : SIGSEGV
« Réponse #7 le: Septembre 02, 2015, 06:37:17 pm »
Remonte la pile d'appels, regarde les variables, les paramètres de fonctions, ...
Laurent Gomila - SFML developer

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : SIGSEGV
« Réponse #8 le: Septembre 03, 2015, 12:42:17 pm »
J'ai trouvé la cause du problème
MainMap appelle updateMoving qui apelle activateTestPath qui plante, et je ne sais pas pourquoi.
bool activateTestPath () {
        eraseActualPath();
        if (xPath_isEmpty() && yPath_isEmpty())
            return false;
        for (unsigned int i(0); i<xPath.size(); i++) {
            x.push_back(xPath[i]); //Plantage du programme ici
        }
        for (unsigned int i(0); i<yPath.size(); i++) {
            y.push_back(yPath[i]);
        }
        eraseTestPath();
        return true;
    }

Vraiment, je vois pas ce qu'il y'a de pas bon...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : SIGSEGV
« Réponse #9 le: Septembre 03, 2015, 12:57:52 pm »
Citer
J'ai trouvé la cause du problème
Pas vraiment non, tu as juste regardé un peu plus haut dans la pile d'appels... :P

Ce n'est pas en scrutant le code que tu vas trouver en tout cas ;)

Par exemple tu peux afficher / regarder au debugger les valeurs de xPath.size() et x.size() juste avant le plantage. Tu peux aussi regarder dans la pile d'appels ce qu'il y a entre push_back() et construct(), ça te donnera peut-être une indication sur la cause du plantage.

Bref ce que j'essaye de te dire, c'est qu'en tant que développeur c'est ton boulot de creuser les problèmes pour les résoudre. De toute façon avec le code que tu nous donnes, on n'en voit pas assez pour trouver la cause du problème. Et pas la peine d'en coller des tartines, on ne va pas s'amuser à compiler et debugger mentalement ton projet alors que ton debugger s'en charge très bien normalement ;)
Laurent Gomila - SFML developer

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : SIGSEGV
« Réponse #10 le: Septembre 03, 2015, 05:01:52 pm »
Entre _gnu_cxx::new_allocator et le push_back j'ai deux std::allocator_traits<std::allocator<int>>::construct (le premier a un S avant le construct je crois...)
Dans la colonne de droite j'ai:

Name ValueType
__p0xffffffe8int*
this@0x28fbcd _gnu_cxx::new_allocator<int>

Et... je fais quoi avec ça ?
« Modifié: Septembre 03, 2015, 05:06:52 pm par S66 »

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : SIGSEGV
« Réponse #11 le: Septembre 04, 2015, 06:15:33 pm »
Pour voir où ça plante, j'ai fait mon for en deux lignes:
_xPath = xPath[i];
            x.push_back(_xPath);
Ca a planté au push_back.
Quand je passe la souris sur le push_back quand le programme a crash à cause du SigSegV j'ai un No Valid expression.
Huh ?

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : SIGSEGV
« Réponse #12 le: Septembre 05, 2015, 05:17:01 pm »
J'ai résolu le SIGSEGV
Par contre j'ai toujours un problème, mon personnage gambade librement (ça c'est bien) là où je n'ai pas cliqué et sors du cadre (pas bien)
Je suppose que vous voulez un peu de code ?
Voici ma fonction updateMoving()
void updateMoving() { // OK
        if (isMoving) {
            if (mgoX != 0 || mgoY != 0) {
                Orientation o;
                if (mgoX > 0 && mgoY == 0)
                    o = Orientation::Droite;
                if (mgoX > 0 && mgoY > 0 && mgoX == mgoY)
                    o = Orientation::DroiteBas;
                if (mgoX == 0 && mgoY > 0)
                    o = Orientation::Bas;

                if (j == Jambe::Gauche || j == Jambe::Normal)
                    orienterPerso(o, Jambe::Droite);
                if (j == Jambe::Droite)
                    orienterPerso(o, Jambe::Gauche);

                if (m_goX == 0 && m_goY == 0) {
                    mgoX = 0;
                    mgoY = 0;
                    isMoving = false;
                    orienterPerso(o);
                    return;
                } else {
                    if (m_goX > 0) {
                        m_perso.move(4.f, 0.f);
                        m_pos.x +=  4.f;
                        m_goX -= 4.f;
                        int _m_goX = static_cast<int>(m_goX);
                        if (_m_goX % 32 == 0) {
                            _m_goX = _m_goX/32;
                            mgoX = 0;
                            for (int i(0); i<_m_goX; i++) {
                                mgoX += 1;
                            }
                        }
                    }
                    if (m_goY > 0) {
                        m_perso.move(0.f, 4.f);
                        m_pos.y +=  4.f;
                        m_goY -= 4.f;
                        int _m_goY = static_cast<int>(m_goY);
                        if (_m_goY % 16 == 0) {
                            _m_goY = _m_goY/16;
                            mgoY = 0;
                            for (int i(0); i<_m_goY; i++)
                                mgoY += 1;
                        }
                    }
                }
                return;
            }

            if (pathToGo.x_isEmpty() || pathToGo.y_isEmpty()) {
                pathToGo.eraseActualPath();
                if (pathToGo.xPath_isEmpty() || pathToGo.yPath_isEmpty()) {
                    pathToGo.eraseTestPath();
                    orienterPerso(direction);
                    isMoving = false;
                    return;
                } else
                    pathToGo.activateTestPath(); //here
            }
            if (pathToGo.x_isEmpty() || pathToGo.y_isEmpty()) {
                isMoving = false;
                orienterPerso(direction);
                return;
            }
            sf::Vector2i iPath = pathToGo.getNewPath();
            mgoX = iPath.x;
            mgoY = iPath.y;

            m_posX += mgoX;
            m_posY += mgoY;

            for (int i(0); i<mgoX; i++)
                m_goX += 32;
            for (int i(0); i<mgoY; i++)
                m_goY += 16;
            return;
        } else
            return;
    }
 
Ou bien le calcul de souris a été mal fait, ou bien c'est une erreur dans updateMoving.
Dans le doute, voici mon code pour la souris:
sf::Event e;
            while (this->pollEvent(e)) {
                if (e.type == sf::Event::MouseButtonPressed)
                {
                    //qDebug() << "ButtonPressed";
                    if (e.mouseButton.button == sf::Mouse::Left) {
                        //qDebug() << "Mouse Left Pressed";
                        if (!isHidden()) {
                            //qDebug() << "Not hidden";
                            sf::Vector2i mousePos = sf::Mouse::getPosition(*this);
                            perso.startMoving(mousePos.x, mousePos.y);
                        }
                    }
                }
            }