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 :

un autre problème de crash


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut un autre problème de crash
    salut,

    mon programme choisie un module aléatoirement dans un fichier xml et le charge.
    ensuite, j'aimerai récupérer la position de plusieurs bones du module et j'arrive à récupérer la position d'un bone mais pas de plusieurs de manière récursive.

    mon code pour récupérer la position d'un bone, qui compile et fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            moduleNode=my_scene->CreateChild("module");
            moduleNode->SetPosition(Vector3(0,0,0));
            AnimatedModel* moduleObject=moduleNode->CreateComponent<AnimatedModel>();
            moduleObject->SetModel(cache->GetResource<Model>(modulePath));
            moduleObject->SetMaterial(cache->GetResource<Material>(moduleTexturePath));
            exit1=moduleNode->GetChild("exit1", true);
            exit1Pos=exit1->GetWorldPosition();
            exit1PosX=exit1Pos.x_;
            exit1PosY=exit1Pos.y_;
            exit1PosZ=exit1Pos.z_;
    mon code pour récupérer plusieurs positions afin de les stocker, qui compile mais crash l'application comme indiqué dans les commentaires :
    Code : 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
     
            moduleNode=my_scene->CreateChild("module");
            moduleNode->SetPosition(Vector3(0,0,0));
            AnimatedModel* moduleObject=moduleNode->CreateComponent<AnimatedModel>();
            moduleObject->SetModel(cache->GetResource<Model>(modulePath));
            moduleObject->SetMaterial(cache->GetResource<Material>(moduleTexturePath));
            //
     
     
            for(listNumber=0;listNumber<exits;listNumber++)
            {
                std::string exit = ("exit");
                {
                    std::ostringstream ss;
                    ss<<listNumber;
                    std::string s(ss.str());
                    exit.append(s);
                }
                const char* exitX = exit.c_str();
     
                Node* exitNode = moduleNode->GetChild(exitX, true);  // this one works
     
                //Vector3 exitPos= exitNode->GetWorldPosition();   //not this one, compile but crash the app
     
                //float exitPosX=exitPos.x_;
                //float exitPosY=exitPos.y_;
                //float exitPosZ=exitPos.z_;
     
            }
    quelqu'un peut me dire ce qui cloche ?

    merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    j'ai lancer mon application avec la console pour voir si elle m'affichait un message d'erreur avec le crash et j'ai eu ceci :
    Erreur de segmentation (core dumped)
    et avec le debugger, il me dit ça :
    Program received signal SIGSEGV, Segmentation fault.
    0x00000000006fe522 in Urho3D::Node::GetWorldPosition (this=0x0)
    at /home/noname/Documents/urho3D_build/include/Urho3D/Scene/../Scene/Node.h:350
    350 if (dirty_)
    quand je regarde mon code, j'me dis que ça vient de mon initialisation du node, peut-être je devrais faire comme pour moduleNode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    moduleNode=my_scene->CreateChild("module");
    j'essayerai demain.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Salut,

    le debugger indique l'erreur 0x00000000006fe522 in Urho3D::Node::GetWorldPosition (this=0x0) ton this est NULL, le seul appel que tu as est sur exit1 donc ton exit1 est NULL. moduleNode->GetChild("exit1", true); retourne donc un NULL, surement qu'aucun child exit1 n'existe dans ton moduleNode.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    ben c'est ça le truc, c'est que si j'utilise la méthode avec exit1, ça marche bien, c'est pour ça que je ne comprends pas.
    le crash se produit quand j'utilise la méthode avec exitX et que //Vector3 exitPos= exitNode->GetWorldPosition(); n'est plus commenté.



    j'ai essayé différentes initialisations pour le node sauf celle ci pour l'instant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exitNode=my_scene->CreateChild("exitNode");
    exitNode->SetPosition(Vector3(0,0,0));
    comme pour le moduleNode en fait.

    j'essayerai demain parce qu'à chaque fois il faut que je switch entre windows et linux.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    c'est bon j'ai compris en fait.
    déjà, je n'ai pas tenté de réinitialisé mon node comme j'ai dit parce que ça voulait dire que je le crée alors qu'il existe déjà et mon problème venait de for (listNumber=0;listNumber<exits;listNumber++).
    mon exit1 existe mais pas exit0... ><
    si je mets for(listNumber=1;listNumber<exits;listNumber++) ça marche sans problèmes.

    merci pour la réponse.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    je suis retombé sur un autre problème assez similaire.
    disons que j'ai réussi à stocker mes positions dans un tableau. je compile, je lance et en fait, mon application crash quand c'est le deuxième module qui est choisi et ne crash pas quand c'est le premier module qui est choisi donc je ne comprends pas parce que les deux modules sont fait de manière identique et exporté de la même manière aussi. la seul différences entre les modules, c'est que l'un a deux "exits" et l'autre en a quatre.

    le message du debugger :
    projet: /home/noname/Documents/urho3D_build/include/Urho3D/Engine/../Core/../Core/../Container/Ptr.h:92: T* Urho3D::SharedPtr<T>::operator->() const [with T = Urho3D::Scene]: Assertion `ptr_' failed.

    Program received signal SIGABRT, Aborted.
    0x00007ffff696fcc9 in __GI_raise (sig=sig@entry=6)
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
    56 ../nptl/sysdeps/unix/sysv/linux/raise.c: Aucun fichier ou dossier de ce type.

    edit : le début de mon main cpp
    Code : 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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
     
     
    #include <Urho3D/Engine/Application.h>
    #include <Urho3D/Engine/Engine.h>
    #include <Urho3D/Input/InputEvents.h>
     
    #include <Urho3D/Core/CoreEvents.h>
    #include <Urho3D/Input/Input.h>
    #include <Urho3D/Resource/ResourceCache.h>
    #include <Urho3D/Resource/XMLFile.h>
    #include <Urho3D/IO/Log.h>
    #include <Urho3D/UI/UI.h>
    #include <Urho3D/UI/Text.h>
    #include <Urho3D/UI/Font.h>
    #include <Urho3D/UI/Button.h>
    #include <Urho3D/UI/UIEvents.h>
    #include <Urho3D/UI/Window.h>
    #include <Urho3D/Scene/Scene.h>
    #include <Urho3D/Scene/SceneEvents.h>
    #include <Urho3D/Graphics/Graphics.h>
    #include <Urho3D/Graphics/Camera.h>
    #include <Urho3D/Graphics/Geometry.h>
    #include <Urho3D/Graphics/Renderer.h>
    #include <Urho3D/Graphics/DebugRenderer.h>
    #include <Urho3D/Graphics/Octree.h>
    #include <Urho3D/Graphics/Light.h>
    #include <Urho3D/Graphics/Model.h>
    #include <Urho3D/Graphics/StaticModel.h>
    #include <Urho3D/Graphics/AnimatedModel.h>
    #include <Urho3D/Graphics/Material.h>
    #include <Urho3D/Graphics/Skybox.h>
    #include <Urho3D/UI/Window.h>
    #include <Urho3D/Math/Vector3.h>
     
     
    #include <string>
    #include <iostream>
    #include <sstream>
    #include <cstdlib>
    #include <time.h>
     
     
     
    //my stuff
    #include "tinyxml2.h"
    #include "fonctions.h"
     
    using namespace Urho3D;
    //using namespace std;
     
    class projet : public Application
    {
     
    public:
     
        //DEFINITION
        SharedPtr<Scene> my_scene;
        SharedPtr<Node> moduleNode;
        SharedPtr<Node> exitNode;
     
        Node* camNode;
     
        Window* window;
        Text* window_text;
     
     
        int modulesCount;
        int randomLine;
        std::string module;
     
        int moduleType;
        int exits;
        const char* modulePath;
        const char* moduleTexturePath;
     
        int listNumber;
     
            struct exitsStruct //is now a type
            {
            int exit_;
            float exitPosX;
            float exitPosY;
            float exitPosZ;
            bool isFree;
            };
     
        //int MODULE_COUNT;
        //int MODULE_MAX; 
     
     
     
     
     
        projet(Context* context) : Application(context)
        {
     
        }
     
        virtual void Setup()
        {
    	// See http://urho3d.github.io/documentation/1.32/_main_loop.html
    	engineParameters_["FullScreen"]=false;
            engineParameters_["WindowWidth"]=1280;
            engineParameters_["WindowHeight"]=720;
            engineParameters_["WindowResizable"]=true;
        }
     
        virtual void Start()
        {
     
            //secondary DEFINITION for no warning
            //listNumber = 0;
            struct exitsStruct exitList[listNumber];
     
            //MODULE_MAX = 10;
     
     
     
     
    	// We will be needing to load resources.
            // All the resources used in this example comes with Urho3D.
            // If the engine can't find them, check the ResourcePrefixPath. <-- where ?
            ResourceCache* cache=GetSubsystem<ResourceCache>();
     
    	// Let's setup a scene to render.
            my_scene=new Scene(context_);
            // Let the scene have an Octree component!
            my_scene->CreateComponent<Octree>();
            // Let's add an additional scene component for fun.
            my_scene->CreateComponent<DebugRenderer>();
    	// what the hell ?!
     
     
     
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    //   loading a random module and list its exits
    ///////////////////////////////////////////////////////////////////////////////////////////////////
     
            //XML
            tinyxml2::XMLDocument modules;
            modules.Parse("Data/Scripts/Modules.xml");
            if(modules.LoadFile("Data/Scripts/Modules.xml") == tinyxml2::XML_NO_ERROR)
            {
                tinyxml2::XMLNode* root = modules.FirstChild();
                tinyxml2::XMLElement* infos = root->FirstChildElement("infos");
                infos->QueryIntAttribute("count", &modulesCount);
                randomLine = chooseRandomLine(modulesCount);
     
                module = ("module");
                {
                    std::ostringstream ss;
                    ss<<randomLine;
                    std::string s(ss.str());
                    module.append(s);
                }
                const char* moduleX = module.c_str();
     
                tinyxml2::XMLElement* randomModule = root->FirstChildElement(moduleX);
                randomModule->QueryIntAttribute("type", &moduleType);
                randomModule->QueryIntAttribute("exits", &exits);
                //faire une liste d'exit
     
                modulePath = randomModule->Attribute("path");
                moduleTexturePath = randomModule->Attribute("texturepath");
     
            }
     
    	// Let's put a module in there.
            moduleNode=my_scene->CreateChild("module");
            moduleNode->SetPosition(Vector3(0,0,0));
            AnimatedModel* moduleObject=moduleNode->CreateComponent<AnimatedModel>();
            moduleObject->SetModel(cache->GetResource<Model>(modulePath));
            moduleObject->SetMaterial(cache->GetResource<Material>(moduleTexturePath));
            //MODULE_COUNT=1;  //there is one module in the scene
     
            for(listNumber=0;listNumber<exits;listNumber++)
            {
                std::string exit = ("exit");
                {
                    std::ostringstream ss;
                    ss<<listNumber;
                    std::string s(ss.str());
                    exit.append(s);
                }
                const char* exitX = exit.c_str();
     
                exitNode = moduleNode->GetChild(exitX, true);  
     
                Vector3 exitPos= exitNode->GetWorldPosition();
     
                exitList[listNumber].exit_=listNumber;
                exitList[listNumber].exitPosX=exitPos.x_;
                exitList[listNumber].exitPosX=exitPos.x_;
                exitList[listNumber].exitPosX=exitPos.x_;
                exitList[listNumber].isFree=true;
            }

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    On ne va pas pouvoir debugger tout ton programme hein..
    Tant que tu fais n'importe quoi avec ta variable exits et itères à l'aveugle sur des index farfelus tu cracheras.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    Tant que tu fais n'importe quoi avec ta variable exits et itères à l'aveugle sur des index farfelus tu cracheras.
    je fais pas n'importe quoi, ma variable exits est récupèré là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     randomModule->QueryIntAttribute("exits", &exits);
    dans un fichier xml,
    où il lui est assigné 2 ou 4 en fonction du module choisi aléatoirement au préalable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <xml>
    <infos count="2"/>
    <module1 type="1" exits="2" path="Models/cor5x20x1/cor5x20x1.mdl" texturepath="Models/cor5x20x1/cor5x20x1.xml"/>
    <module2 type="2" exits="4" path="Models/room20x20x1/room20x20x1.mdl" texturepath="Models/room20x20x1/room20x20x1.xml"/>
    </xml>
    les modèles ont bien respectivement 2 et 4 bones avec comme nom exit0, exit1 pour le premier et exit0, exit1, exit2, exit3 pour l'autre.
    et donc, en fonction du nombre d'exits, 2 ou 4, je stock les positions de chaque exit dans un tableau de struct.

    si le programme choisi aléatoirement le module avec 2 exits, tous se passe bien, si il choisi le module avec 4 exits, il crash pour je ne sais quelle raison alors que ça n'arrivait pas avant, la preuve en est que c'est le deuxième module sur le screenshot donc je ne comprends pas.
    logiquement, le problème dois venir du module en question mais il est fait et exporté exactement de la même manière que l'autre et j'ai vérifié au cas où j'avais fait une erreurs en renommant les exits "exit0, exit1, exit2 et exit3" à la place de "exit1, exit2, exit3, exit4" mais tout est comme il faut apparement.

    après j'suis un débutant hein, je ne pense pas m'être trompé de forum.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    QueryIntAttribute retourne une valeur pour indiquer si oui ou non il a trouvé la valeur et modifié la variable. Si l'attribut n'est pas trouvé, ta variable est inchangée et a une valeur aléatoire puisque tu ne l'initialises pas. Les 3/4 de tes pointeurs ne sont pas testés à null et tu comptes sur le fait que tes data soient correctes, que tes noeuds existent, que leurs attributs existent. Or ton problème est clairement un problème de data plus que de code. Alors vérifie tes xml, mdl etc Parce que si ton code crashe parce que exit3 retourne un pointeur null, c'es que exit3 n'existe pas. Le programme ne s'amuse pas à décréter qu'une variable est null pour t'embêter.
    Et le debugger sera bien plus efficace (c'est son boulot) pour te faire debugger ligne à ligne ton programme.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    je comprends que je n'initialise pas mes variables comme il faut apparemment mais alors comment initialiser plusieurs variables qui peuvent ou non exister ?
    j'ai un peu de mal pour coder l'abstraction je crois.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    Les 3/4 de tes pointeurs ne sont pas testés à null et tu comptes sur le fait que tes data soient correctes, que tes noeuds existent, que leurs attributs existent. Or ton problème est clairement un problème de data plus que de code.
    j'ai changer mon code histoire de te montrer que mes data sont bien là.



    c'est cette partie de mon code qui pose problème apparemment pour une raison qui m'échappe.
    Code : 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
     
            for(listNumber=0;listNumber<exits;listNumber++)
            {
                std::string exit = ("exit");
                {
                    std::ostringstream ss;
                    ss<<listNumber;
                    std::string s(ss.str());
                    exit.append(s);
                }
                const char* exitX = exit.c_str();
     
                exitNode = moduleNode->GetChild(exitX, true);  
     
                Vector3 exitPos = exitNode->GetWorldPosition();
     
                exitList[listNumber].exit_=listNumber;
                exitList[listNumber].exitPosX=exitPos.x_;
                exitList[listNumber].exitPosX=exitPos.x_;
                exitList[listNumber].exitPosX=exitPos.x_;
                exitList[listNumber].isFree=true;
            }

    edit: d'ailleurs je ne sais pas trop pourquoi mes valeurs ne sont pas toutes aussi précises les unes que les autres car dans blender mes modules ont les dimensions de leur nom: 5x20x1 et 20x20x1.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    j'essaye de réorganiser mon code avec des classes pour bien tout initialiser comme il faut mais je suis retombé sur un autre problème.

    j'ai d’abord ma classe Counts :
    Code : 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
     
    //Counts.h
     
    #include "tinyxml2.h"
    class Counts
    {
        public:
        int room_count;
        int cor_count;
        int junc_count;
     
        Counts();
    };
     
    //Counts.cpp
    #include <string> //std::string
    #include "tinyxml2.h"
    #include "Counts.h"
    #include <Urho3D/Math/Vector3.h>
     
    using namespace Urho3D;
     
    Counts::Counts()
    {
        tinyxml2::XMLDocument modules;
        modules.Parse("Data/Scripts/Modules.xml");
        if(modules.LoadFile("Data/Scripts/Modules.xml") == tinyxml2::XML_NO_ERROR)
        {
            tinyxml2::XMLNode* root = modules.FirstChild();
            tinyxml2::XMLElement* infos = root->FirstChildElement("infos");
            infos->QueryIntAttribute("room_count", &room_count);
            infos->QueryIntAttribute("cor_count", &cor_count);
            infos->QueryIntAttribute("junc_count", &junc_count);
        }
    }
    et je veux m'en servir dans ma classe Room:
    Code : 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
    74
    75
    76
    77
    78
     
    //Module.h
    #include <Urho3D/Math/Vector3.h>
    #include <string> //std::string
    #include "Counts.h"
    #include "tinyxml2.h"
    #include "fonctions.h"
    #include "conversion.h"
     
    using namespace Urho3D;
    class Room
    {
        public:
        int type;
        int exit;
        std::string path;
        std::string texturepath;
        Vector3 position;
        Vector3 rotation; //direction in urho, did i need to change bone orientation in blender ?
     
        Room();
        void loadRoom(int id, Scene* scene, ResourceCache* cache);
    };
     
    //Module.cpp
    [...]
    #include <string> //std::string
     
    #include "Module.h"
    #include "Counts.h"
    #include "tinyxml2.h"
    #include "fonctions.h"
    #include "conversion.h"
     
    using namespace Urho3D;
    Counts XMLcounts; ////////////////////////////////// ERREUR DU COMPILATEUR
     
    Room::Room()
    {
        type=0;  //default type
        exit=0;
        path="";
        texturepath="";
        position=Vector3(0,0,0);
        rotation=Vector3(0,0,0); //direction in urho, did i need to change bone orientation in blender ?
    }
     
    void Room::loadRoom(int id, Scene* scene, ResourceCache* cache)
    {
     
        int roomNbr = chooseRandomNbr(XMLcounts.room_count);  ///////////// OU J'UTILISE LA CLASSE
        std::string roomX = stringInt("room",roomNbr);
        const char* RoomX = roomX.c_str();
     
        tinyxml2::XMLDocument modules;
        modules.Parse("Data/Scripts/Modules.xml");
        if(modules.LoadFile("Data/Scripts/Modules.xml") == tinyxml2::XML_NO_ERROR)
        {
            tinyxml2::XMLNode* root = modules.FirstChild();
            tinyxml2::XMLElement* randomModule = root->FirstChildElement(RoomX);  //need const char*
            randomModule->QueryIntAttribute("exits", &exit);    
            path = randomModule->Attribute("path");
            texturepath = randomModule->Attribute("texturepath");
        }
     
        std::string roomName = IntString(id, roomX);
        String room_name = string2urhoString(roomName);
        String m_path = string2urhoString(path);
        String m_texturepath = string2urhoString(texturepath);
     
        Node* m_node;
        m_node=scene->CreateChild(room_name); //  ATTENTION
        m_node->SetWorldPosition(position);
        m_node->SetDirection(rotation);  //don't compile ?? Oo
        AnimatedModel* m_Object=m_node->CreateComponent<AnimatedModel>();
        m_Object->SetModel(cache->GetResource<Model>(m_path));
        m_Object->SetMaterial(cache->GetResource<Material>(m_texturepath));
    }
    et j'ai ce message d'erreur quand j'essaye de compiler :
    CMakeFiles/projet.dir/Module.cpp.o: dans la fonction « __static_initialization_and_destruction_0 »:
    /home/noname/Bureau/projet/Module.cpp:43: référence indéfinie vers « Counts::Counts() »
    collect2: error: ld returned 1 exit status
    make[2]: *** [bin/projet] Erreur 1
    make[1]: *** [CMakeFiles/projet.dir/all] Erreur 2
    make: *** [all] Erreur 2

    1/ je sais que je peux initialiser ma classe mieux que ça pour y définir mes valeurs par défaut mais je le ferrais plus tard vu que j'ai encore un peu de mal avec le constructeur.
    2/ avec ce message d'erreur, j'me dis que j'dois peut-être utiliser des membres static ou const vu que les valeurs de ma classe Counts ne change pas mais j'sais pas trop comment ça marche, quelqu'un peut-il m'éclairer la dessus ou me dire pourquoi le compilateur considère ma classe comme non définie ?

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 455
    Par défaut
    ou me dire pourquoi le compilateur considère ma classe comme non définie ?
    C'est pas le compilateur, c'est le linker.
    Est-ce que le fichier "Counts.cpp" fait partie des fichiers à compiler (cf. ton IDE) ?
    Est-ce que le fichier objet résultat de la compilation de "Counts.cpp" fait partie des fichiers en entré du linker (cf. ton IDE) ?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Par défaut
    non, il ne faisait pas partie des fichiers à compiler merci.
    j'ai ajouté pas mal de fichiers pour mes classes et j'avais oublié de relancer mon script entre temps.
    je n'utilise pas d'ide, j'utilise un petit script avant de compiler avec "make" et il se charge de prendre en compte les fichiers qui sont à compiler.

    mon petit script
    ./cmake_generic.sh /home/noname/Bureau/projet_build -DCMAKE_BUILD_TYPE=Debug
    le "cmake generic"
    Code : 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
     
    #!/usr/bin/env bash
    #
    # Copyright (c) 2008-2015 the Urho3D project.
    #
    # Permission is hereby granted, free of charge, to any person obtaining a copy
    # of this software and associated documentation files (the "Software"), to deal
    # in the Software without restriction, including without limitation the rights
    # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    # copies of the Software, and to permit persons to whom the Software is
    # furnished to do so, subject to the following conditions:
    #
    # The above copyright notice and this permission notice shall be included in
    # all copies or substantial portions of the Software.
    #
    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    # THE SOFTWARE.
    #
     
    # Determine source tree and build tree
    if [ "$1" ] && [[ ! "$1" =~ ^- ]]; then BUILD=$1; shift; elif [ -f $(pwd)/CMakeCache.txt ]; then BUILD=$(pwd); else caller=$(ps -o args= $PPID |cut -d' ' -f2); if [[ ! "$caller" =~ cmake_.*\.sh$ ]]; then caller=$0; fi; echo "Usage: ${caller##*/} /path/to/build-tree [build-options]"; exit 1; fi
    SOURCE=$(cd ${0%/*}; pwd)
    if [ "$BUILD" == "." ]; then BUILD=$(pwd); fi
     
    # Define helpers
    . "$SOURCE"/.bash_helpers.sh
     
    # Detect CMake toolchains directory if it is not provided explicitly
    [ "$TOOLCHAINS" == "" ] && TOOLCHAINS=$SOURCE/CMake/Toolchains
    [ ! -d "$TOOLCHAINS" -a -d $URHO3D_HOME/share/Urho3D/CMake/Toolchains ] && TOOLCHAINS=$URHO3D_HOME/share/Urho3D/CMake/Toolchains
     
    # Default to native generator and toolchain if none is specified explicitly
    IFS=#
    OPTS=
    for a in $@; do
        case $a in
            --fix-scm)
                FIX_SCM=1
                ;;
            Eclipse\ CDT4\ -\ Unix\ Makefiles)
                ECLIPSE=1 && if xmlstarlet --version >/dev/null 2>&1; then HAS_XMLSTARLET=1; fi
                ;;
            -DIOS=1)
                IOS=1
                ;;
            -DANDROID=1)
                ANDROID=1 && OPTS="-DCMAKE_TOOLCHAIN_FILE=$TOOLCHAINS/android.toolchain.cmake"
                ;;
            -DRPI=1)
                RPI=1 && if [[ ! $(uname -m) =~ ^arm ]]; then OPTS="-DCMAKE_TOOLCHAIN_FILE=$TOOLCHAINS/raspberrypi.toolchain.cmake"; fi
                ;;
            -DWIN32=1)
                WINDOWS=1 && OPTS="-DCMAKE_TOOLCHAIN_FILE=$TOOLCHAINS/mingw.toolchain.cmake"
                ;;
            -DEMSCRIPTEN=1)
                HTML5=1 && OPTS="-DCMAKE_TOOLCHAIN_FILE=$TOOLCHAINS/emscripten.toolchain.cmake"
                ;;
        esac
    done
     
    # Create project with the chosen CMake generator and toolchain
    cmake -E make_directory "$BUILD" && cmake -E chdir "$BUILD" cmake $OPTS $@ "$SOURCE" && post_cmake
    unset IFS
     
    # vi: set ts=4 sw=4 expandtab:
    du coup j'ai encore un autre problème de crash mais je devrais m'en sortir avec google ou autre ou en vérifiant mon code.
    j'essaye de bien organiser mon code et mes objets mais j'avoue que les classes ne sont pas vraiment ma tasse de thé.

    merci.

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/01/2013, 15h01
  2. Réponses: 1
    Dernier message: 23/01/2013, 16h09
  3. Réponses: 2
    Dernier message: 21/10/2009, 17h51
  4. Réponses: 0
    Dernier message: 04/05/2008, 18h07
  5. Réponses: 4
    Dernier message: 12/04/2006, 20h25

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