Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL+OpenGL]tableau d'objet en attribut

Sujet résolu
    29 novembre 2007 à 10:20:31

    Bonjours à toutes et a tous :)

    je suis en train de travailler avec le tuto de Once pour la création d'un moteur de particule. (le tuto en question)

    je travaille donc avec OpenGl j'utilise SDL le tout avec CodeBlock.

    j'ai reussis dans un premier temps sans trop de soucis en suivant le tuto, puis j'ai essayer d'apporter mes propres modification. Actuellement j'essaie de refaire ce moteur en utilisant des classes.

    Je suis partis dans l'idée de créer deux class, PartEngine et Particule. Le premier gérant donc un tableau du deuxieme.

    et c'est là que j'ai un problème :euh:

    j'ai reussis a creer les classes sans que le compilateur plante ^^
    si je fais une instance de PartEngine qui gere 500 particule ca fonctionne d'ailleur.

    mais lorsque je quitte le programme j'ai l'erreur suivante:
    Image utilisateur


    avec 1000 particules le programme se ferme immédiatement et le build log m'indique: process terminated with status 1.

    en cherchant un peu il semble que cela vienne d'un probleme d'allocation de mémoire, mais je n'arrive pas à mettre le doigts dessus.

    si quelqu'un voit où se trouve l'erreur, d'avance merci.

    PS: voici le code de mes classes avec les constructeurs, j'en mettrait plus si necessaire.

    1. class Particle
    2. {
    3.     private:
    4.         bool active; // Active (1=Oui/0=Non)
    5.         double life; // Durée de vie
    6.         double fade; // Vitesse de disparition
    7.         float r, g, b; // Valeurs RGB pour la couleur
    8.         double x, y, z; // Position
    9.         double xi, yi, zi; // Vecteur de déplacement
    10.         double xg, yg, zg; // Gravité
    11.     public:
    12.     //créateur
    13.         Particle::Particle();

    les autres methode ne sont que des setteurs et accesseurs.

    1. class PartEngine //Gère un moteur de particule
    2. {
    3.     private:
    4.         int nbr; // nombre de particule
    5.         Particle *tab_part;
    6.     public:
    7.         PartEngine::PartEngine();
    8.         PartEngine::PartEngine(int nombre);
    9.         static double PartEngine::alea(double min, double max);
    10.         int PartEngine::initParticles();
    11.         int PartEngine::dessinerParticules();
    12.         ~PartEngine();
    13. };


    pour les constructeurs celui de Particule est vide.
    et voila celui de PartEngine que j'utilise

    1. PartEngine::PartEngine(int nombre) : nbr(nombre)
    2. {
    3.     tab_part = new Particle[nombre];
    4. }


    Voila en esperant que quelqu'un puisse m'aider.
    • Partager sur Facebook
    • Partager sur Twitter
      29 novembre 2007 à 10:22:30

      -> debuggueur.
      Il te dira ou ça crash.
      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        29 novembre 2007 à 10:47:55

        As tu bien désaloué la mémoire ?
        Ne jamais oublier: un programme doit comporter autant de new que de delete !

        Tu n'a pas donné le code de ton destructeur, mais celui-ce devrait ressembler à ceci:

        1. PartEngine::~PartEngine()
        2. {
        3.      delete[] tab_part;
        4. }
        • Partager sur Facebook
        • Partager sur Twitter
          29 novembre 2007 à 11:03:59

          sebajuste, Pour le destructeur effectivement je ne l'ai pas mis mais tu viens de le faire a ma place ;)

          en ce qui conscerne le debugger je crains que ce ne soit ma grosse faiblesse de programmeur, je sais pas trop comment l'utiliser. (au passage si vous avez des sites/tuto interessant sur le sujet, je suis preneur)

          Malgré tout j'ai fait un essais et il m'indique soit
          No symbol "PartEngine" in current context.
          Previous frame inner to this frame (corrupt stack?)

          avec 500 particules

          soit:
          Program received signal (SIGSEGV)
          Segmentation fault
          No symbol "PartEngine" in current context.

          avec 1000 particules

          ce sont ces messages qui me font dire dans mon premier post

          Citation : premier post

          en cherchant un peu il semble que cela vienne d'un probleme d'allocation de mémoire, mais je n'arrive pas à mettre le doigts dessus.



          mais justement je n'arrive pas a utiliser le debugger pour aller plus loin dans mes investigations.
          • Partager sur Facebook
          • Partager sur Twitter
            29 novembre 2007 à 11:24:57

            Programmer sans debuggueur, c'est se handicaper gravement. Il est important que tu apprennes a t'en servir ! tu ne pourras pas etrenellement programmer a l'aveuglette !

            C'est un peu comme si tu te traçais un parcours d'obstacle, en essayant de prendre toutes tes précautions, et qu'ensuite, tu te disais "allez, je l'essaie ce parcours", et que tu te bandais les yeux et que tu mettais a courir.... Au moment ou tu vas faire "Aïe..." ça voudra dire que ton parcours d'obstacle n'était pas parfait... Mais avec les yeux bandés, tu ne sauras meme pas ou tu es...
            • Partager sur Facebook
            • Partager sur Twitter

            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

              29 novembre 2007 à 12:49:54

              J'en suis parfaitement conscient et je cherche depuis longtemps des infos sur celui de codeblocks, (je viens de trouver un tuto j'espere que ca m'apportera quelque chose)

              toutefois en attendant j'essaye de faire comme je peut.

              Lorsque j'utilise la commande debug de codeblocks j'obtiens une fenetre back-trace qui s'arrete regulierement a une ligne en citant ma fonction d'affichage. cette fonction fais nottament appel a la methode dessinerParticules de PartEngine.

              De ce fait je me suis rendu compte que le programme tourne sans probleme lorsque je met cet appel en commentaire, mais je n'ai aucune particule a l'ecran du coup ^^

              en gros cette methode est un copier coller de celle utilisée par Once dans son tuto, si besoin je la posterais.
              • Partager sur Facebook
              • Partager sur Twitter
                6 décembre 2007 à 12:02:45

                hop je m'autorise un petit up car mon probleme a evolué.

                J'ai enfin réussis a me servir du debugger de code block, mais je ne suis pas sur d'avoir réellement isolé le pb. j'ai remarque par contre que les valeurs de mes particules devenait démesurée (genre 2.234E+303) au bout de quelques tours de boucle et le programme fini par planté sur une erreur de memoire inaccessible.

                par contre j'ai remarqué qu'en définissant mon objet moteur de particule en global dans le programme, il n'y avait plus aucun probleme, meme avec un grand nombre de particule.

                Je me demande du coup si je n'ai pas un soucis dans le passage d'objet en parametre, en effet je le fait de la facon suivante:

                ...
                class objet;

                fonction(objet);
                ...

                void fonction(class objet)
                {
                }

                j'ai voulu essayé de passer un pointeur mais ca ne passe pas.

                quelqu'un aurait une methode pour le passage d'objet en parametre?
                • Partager sur Facebook
                • Partager sur Twitter
                  6 décembre 2007 à 12:06:00

                  passe le par référence !
                  Avec ce que tu fais, ça recopie completement l'objet (ça peut etre lourd, et pas forcément utile)

                  void fonction(class objet&)

                  rien que ce petit & en plus ne recopie pas l'objet. Bon gain de temps.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                    6 décembre 2007 à 12:10:08

                    merci, tu confirme ce que je pensais, mais je ne trouvais pas la synthaxe pour obtenir ce résultat. Je vais tester ca et le graver dans un coin ^^

                    edit: Oki ca marche maintenant!

                    petit details, j'ai du faire fonction(class &objet) sinon le compilateur bloquait ^^

                    Pour conclure le probleme semblait venir de la multiplication de tableau (je le passait deux fois dans des fonctions par valeurs). 3 tableaux de 1000 objets ayant chacun un certain nombres s'attribut, ca doit pas etre facile a gerer en memoire.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [SDL+OpenGL]tableau d'objet en attribut

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown