IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problèmes inquiétants recherche dans une std::map


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Problèmes inquiétants recherche dans une std::map
    Salut!
    j'ai une méthode pour tester si une entité n'a pas déjà été ajoutée dans une std::map.

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    bool Map::containsVisibleEntity(Entity* entity) {
                VEntitiesByType it;
                it = vEntitiesByType.find(entity->getType());
                if (it == vEntitiesByType.end())
                    return false;
                for (unsigned int i = 0; i < it->second.size(); i++) {
                    if (it->second[i] == entity) {
                        return true;
                    }
                }
                return false;
            }
    Mais lorsque entity->getType() qui vaut "E_HERO" par exemple ça ne me trouve pas le type. pourtant lorsque je tape ça :
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    it = vEntitiesByType.find(entity->getType("E_HERO));
    Là il me trouve le type et pourtant les deux strings sont les même.

    Un autre problème aussi les adresses de it->second[i] et de entity sont différentes hors que c'est la même entité donc il ne la trouve pas.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Difficile d'en dire plus sans avoir un minimum de code... Qu'est-ce que VEntitiesByType ? Et que retourne getType ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Invité
    Invité(e)
    Par défaut
    J'ai un crash dans la classe ShadowRenderComponent voici ce que m'affiche la pile d'appel du débugueur :
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #0 0x80eaeea	odfaeg::graphic::Entity::getParent(this=0xc1) (/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/entity.cpp:143)
    #1 0x80f201a	odfaeg::graphic::ShadowRenderComponent::drawNextFrame(this=0x9a93248) (/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/shadowRenderCompoenent.cpp:146)
    #2 0x80f5e1f	odfaeg::core::DynamicWrapper<void, odfaeg::graphic::ShadowRenderComponent>::operator()<odfaeg::graphic::ShadowRenderComponent<> >(this=0x847d148, o=0x9a93248) (/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Math/../Core/fastDelegate.h:309)
    #3 0x80f5a93	std::_Function_handler<void (odfaeg::graphic::ShadowRenderComponent*&), odfaeg::core::DynamicWrapper<void, odfaeg::graphic::ShadowRenderComponent<> > >::_M_invoke(std::_Any_data const&, odfaeg::graphic::ShadowRenderComponent*&)(__functor=..., __args#0=@0x847d15c: 0x9a93248) (/usr/include/c++/4.9/functional:2039)
    #4 0x80f6df3	std::function<void (odfaeg::graphic::ShadowRenderComponent*&)>::operator()(odfaeg::graphic::ShadowRenderComponent*&) const(this=0x847a4dc, __args#0=@0x847d15c: 0x9a93248) (/usr/include/c++/4.9/functional:2440)
    #5 0x80f6752	odfaeg::core::FastDelegateImpl<void, odfaeg::graphic::ShadowRenderComponent*>::call<0u, void*&, void*&, void*&, void*&>(this=0x847a4d8) (/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Math/../Core/fastDelegate.h:480)
    #6 0x80f621c	odfaeg::core::FastDelegateImpl<void, odfaeg::graphic::ShadowRenderComponent*>::operator() (this=0x847a4d8, p0=0x0, p1=0x0, p2=0x0, p3=0x0) (/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Math/../Core/fastDelegate.h:449)
    #7 0x806a5d2	odfaeg::core::FastDelegate<void>::operator()<>() const(this=0x9593468) (/usr/local/include/odfaeg/Core/fastDelegate.h:552)
    #8 0x814ba63	odfaeg::core::Command::operator() (this=0x9593464) (/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/command.cpp:86)
    #9 0x807d15d	odfaeg::core::Listener::processEvents(this=0x9a933ec) (/usr/local/include/odfaeg/Core/listener.h:126)
    #10 0x80e2a6b	odfaeg::graphic::Component::processEvents(this=0x9a93248) (/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/component.cpp:20)
    #11 0x80e3589	odfaeg::graphic::RenderComponentManager::updateComponents(this=0x846a508) (/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/renderComponentManager.cpp:107)
    #12 0x807d8ab	odfaeg::core::Application::render(this=0xbffef518) (/usr/local/include/odfaeg/Core/application.h:127)
    #13 0x807d616	odfaeg::core::Application::exec(this=0xbffef518) (/usr/local/include/odfaeg/Core/application.h:79)
    #14 0x807a8f4	main(argv=1, argc=0xbffff604) (/home/laurent/Développement/Projets-c++/ODFAEG-CLIENT/main.cpp:18)

    Pour le projet ODFAEG-DEMO ça ne crash pas par contre pour le projet ODFAEG-CLIENT là oui pourtant j'utilise le même code source car j'ai tout mis dans une bibliothèque. (Le projet ODFAEG)

    Je ne sais vraiment pas pourquoi les valeurs de mes pointeurs changent comme ça toute seule à l'exécution.

    Si vous voulez voir le code il est sur mon répertoire git, ici même :

    https://github.com/LaurentDuroisin/ODFAEG

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    J'ai jeté un coup d'oeil au code, et je n'ai pas trouvé le problème. Et c'est normal... Le code n'est pas écrit de telle manière que ce genre de problème soit trivial à trouver. Il y a des pointeurs nus dans tous les sens, du coup on ne sait pas trop qui fait quoi, qui crée l'objet, qui le garde vivant, qui le détruit et quand...

    Je te conseillerais donc de commencer par une bonne résolution de nettoyage de ton code, qui ne s'en trouvera que plus clair à maintenir et deboguer. La principale question à se poser est la suivante : Qui possède une entité (et donc qui est responsable de sa destruction) ?

    Est-ce sont entité parente ? Met dans Entity un vector<unique_ptr<Entity>>. Puis adapte le reste du code.
    Est-ce la map ? Met dans Map un vector<unique_ptr<Entity>>. Puis adapte le reste du code.
    Est-ce ailleurs ? Tu auras compris...
    Est-ce un peu plusieurs choses ? Refléchis à revoir le design. Et si c'est vraiment justifié, met dans tous les possesseurs des vector<shared_ptr<Entity>>. Puis adapte le reste du code.

    En particulier, en fin de nettoyage, il ne devrait plus y avoir un seul delete dans ton code.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Salut, c'est la classe CellMap qui se charge de la destruction des entités.
    La classe GridMap se charge de la destruction des CellMap.
    Et la classe Map détruit la GridMap.
    Et c'est la classe World qui détruit les Map.

    Heu..., je n'utilise plus de delete normalement j'ai mis des std::unique_ptr partout.

    Par contre il est vrai que j'utilise beaucoup de pointeurs, enfin, pour Entity je suis obligé vu qu'utilise le polymorphisme et l'héritage.
    Mais pour les classe Shader, RenderTexture et tout ça je pourrais les supprimer.

    J'ai tenté un affichage de l'adresse des pointeurs ici :
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ////////////////////////////////////////////////////////////
            VertexArray::VertexArray(PrimitiveType type, unsigned int vertexCount, Entity* entity) :
            m_vertices     (vertexCount),
            m_primitiveType(type),
            m_entity(entity)
            {
                 std::cout<<"set vertex array entity adr : "<<entity<<std::endl;
            }

    Et ici :
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    void ShadowRenderComponent::drawNextFrame() {
                    math::Vec3f centerLight = g2d::AmbientLight::getAmbientLight().getLightCenter();
                    View lightView = View(view.getSize().x, view.getSize().y, -g2d::AmbientLight::getAmbientLight().getHeight(), g2d::AmbientLight::getAmbientLight().getHeight());
                    lightView.setCenter(centerLight);
                    math::Vec3f forward = view.getPosition() - lightView.getPosition();
                    math::Vec3f target = lightView.getPosition() + forward;
                    lightView.lookAt(target.x, target.y, target.z);
                    stencilBuffer->setView(lightView);
                    math::Vec3f v = lightView.getPosition() - view.getPosition();
                    RenderStates states;
                    states.shader = buildShadowMapShader.get();
                    physic::BoundingBox viewArea = view.getViewVolume();
                    math::Vec3f position (viewArea.getPosition().x,viewArea.getPosition().y, view.getPosition().z);
                    math::Vec3f size (viewArea.getWidth(), viewArea.getHeight(), 0);
                    for (unsigned int i = 0; i < m_instances.size(); i++) {
                        states.texture = m_instances[i].getMaterial().getTexture();
                        if (m_instances[i].getMaterial().getTexture() != nullptr) {
                            buildShadowMapShader->setParameter("haveTexture", 1);
                        } else {
                            buildShadowMapShader->setParameter("haveTexture", 0);
                        }
                        stencilBuffer->draw(m_instances[i].getAllVertices(), states);
                    }
                    stencilBuffer->display();
                    stencilBufferTile->setPosition(position);
                    shadowMap->setView(view);
                    math::Matrix4f biasMatrix(0.5f, 0.0f, 0.0f, 0.0f,
                                              0.0f, 0.5f, 0.0f, 0.0f,
                                              0.0f, 0.0f, 0.5f, 0.0f,
                                              0.5f, 0.5f, 0.5f, 1.f);
                    math::Matrix4f depthBiasMatrix = biasMatrix * view.getViewMatrix().getMatrix() * view.getProjMatrix().getMatrix();
                    perPixShadowShader->setParameter("depthBiasMatrix", depthBiasMatrix.transpose());
                    states.shader = perPixShadowShader.get();
                    for (unsigned int i = 0; i < m_instances.size(); i++) {
                        states.texture = m_instances[i].getMaterial().getTexture();
                        if (m_instances[i].getMaterial().getTexture() != nullptr) {
                            perPixShadowShader->setParameter("haveTexture", 1);
                        } else {
                            perPixShadowShader->setParameter("haveTexture", 0);
                        }
                        for (unsigned int j = 0; j < m_instances[i].getVertexArrays().size(); j++) {
                            states.transform = m_instances[i].getTransforms()[j];
                            math::Vec3f shadowOrigin, shadowCenter, shadowScale(1.f, 1.f, 1.f), shadowRotationAxis;
                            float shadowRotationAngle = 0;
                            std::cout<<"entity adr : "<<m_instances[i].getVertexArrays()[j].getEntity()<<std::endl;
                            if (m_instances[i].getVertexArrays()[j].getEntity() != nullptr && m_instances[i].getVertexArrays()[j].getEntity()->getParent() != nullptr) {
                                Entity* entity = m_instances[i].getVertexArrays()[j].getEntity()->getParent();
                                if (entity->isModel()) {
                                    shadowCenter = static_cast<Model*>(entity)->getShadowCenter();
                                    shadowScale = static_cast<Model*>(entity)->getShadowScale();
                                    shadowRotationAxis = static_cast<Model*>(entity)->getShadowRotationAxis();
                                    shadowRotationAngle = static_cast<Model*>(entity)->getShadowRotationAngle();
                                    shadowOrigin = static_cast<Model*>(entity)->getShadowOrigin();
                                }
                            }
                            TransformMatrix tm;
                            tm.setOrigin(shadowOrigin);
                            tm.setScale(shadowScale);
                            tm.setRotation(shadowRotationAxis, shadowRotationAngle);
                            tm.setTranslation(shadowOrigin + shadowCenter);
                            tm.update();
                            perPixShadowShader->setParameter("shadowProjMat", tm.getMatrix().transpose());
                            shadowMap->draw(m_instances[i].getVertexArrays()[j], states);
                        }
                    }
                    RectangleShape rect(size * 2.f);
                    rect.setPosition(position - size * 0.5f);
                    rect.setFillColor(sf::Color(100, 100, 100, 128));
                    shadowMap->draw(rect);
                    shadowMap->display();
                    shadowTile->setPosition(position);
                }
    Et dans la classe ShadowRenderComponent il n'y a aucun pointeur sur l'entité qui contient l'adresse d'un pointeur sur entité que j'affiche dans la classe VertexArray.

    Je viens de mettre à jour le dépot git. (j'ai nettoyé un peu)
    Mais si j'ai une classe qui utilise un pointeur mais sans le détruire je suis obligé d'utilisé un pointeur nu non ?
    Je ne peux pas utilisé un std::unique_ptr alors je n'utilise des std::unique_ptr que dans les classe qui se charge de détruire.
    Dernière modification par Invité ; 02/01/2019 à 19h47.

  6. #6
    Invité
    Invité(e)
    Par défaut
    J'ai trouvé pourquoi ça plante, dans la classe VertexArray j'ai oublié d'écrire le pointeur vers entity lorsque j'envoie le tout sur le réseau.

    Par contre en ce qui concerne la méthode containsVisibleEntity de la classe Map elle ne fonctionne toujours pas pourtant getType() de la classe Entity me renvoie un std::string pourtant la valeur du std::string vaut bien "E_HERO" et la std::string est présente dans la map mais malgré ça il ne la trouve pas.

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Laurent7601 Voir le message
    Salut, c'est la classe CellMap qui se charge de la destruction des entités.
    La classe GridMap se charge de la destruction des CellMap.
    Et la classe Map détruit la GridMap.
    Et c'est la classe World qui détruit les Map.

    Heu..., je n'utilise plus de delete normalement j'ai mis des std::unique_ptr partout.
    Ce n'est pas ce que j'ai vu (mais je n'ai pas non plus passé des heures sur ton code, je ne doute pas qu'il y a aussi des endroits où tu les utilises):

    https://github.com/LaurentDuroisin/O...s/map.cpp#L454 : Tu crées un Tile par new
    https://github.com/LaurentDuroisin/O...s/map.cpp#L463 : Tu as l'air de l'accrocher à son parent
    https://github.com/LaurentDuroisin/O...entity.cpp#L81 : Tu le mets dans un vecteur de pointeurs nus

    Donc il y a bien gestion et transmission de propriété sans passer par des unique_ptr...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ha mais le code affiché là n'est pas à jour, il faut utiliser git pull pour récupérer le code plus récent je ne sais pas pourquoi git ne met pas à jour l'affichage des fichiers quand je fais un git push...

Discussions similaires

  1. Recherche dans une std::list et suppression.
    Par Nyko17 dans le forum SL & STL
    Réponses: 5
    Dernier message: 02/05/2008, 12h53
  2. problème de recherche dans une base de donnée mysql
    Par Xini28 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 24/10/2005, 18h00
  3. problème de recherche dans une base de données
    Par bouzid_mehdi dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/07/2005, 06h47
  4. Libérer des pointeurs dans une std::map
    Par GaldorSP dans le forum SL & STL
    Réponses: 2
    Dernier message: 09/07/2005, 14h42
  5. Problème de recherche dans une BD
    Par ledevelopeur dans le forum Bases de données
    Réponses: 5
    Dernier message: 28/04/2004, 09h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo