Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C/SDL]Pointeur/Structure et Memory leak

formation d'un agregat

    26 janvier 2007 à 16:14:59

    Bonjour, je suis en train de monter mon projet d'info (formation d'un agregat) et j'ai différents problèmes

    Pour les personnes intéressées, voilà :
    le projet sans structure (pause: touche p ou espace, fermer: echap ou croix en haut à droite): Il marche
    http://eolindel.free.fr/images/agregat.zip
    le projet avec structure: Il marche pas
    http://eolindel.free.fr/images/agregat2.zip

    Mon premier problème est que j'utilise une structure pour passer tout ce qui est coordonnées, j'ai donc tenté une approche avec pointeur
    dans mon .h
    typedef struct Coordonnees Coordonnees;
    struct Coordonnees
    {
        long x;
        long y;
    };

    dans mon main
        Coordonnees *taille;
        taille->x=301; taille->y =301;

    rien que ça et ça plante déjà :/



    2ème problème, si je lance le programme, il tourne à fond, ça c'est normal, mais je soupçonne un problème de memory leak: il consomme de plus en plus, je pense que ça vient de l'affichage du compteur qui est très gourmand
            //dessin
            rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, 1, 1, 32, 0, 0, 0, 0);
            SDL_FillRect(rectangle, NULL, black);
            position.x = top_x+i;
            position.y = top_y+j;
            SDL_BlitSurface(rectangle, NULL, screen, &position);
            //SDL_UpdateRect(screen, top_x+i, top_y+j, 1, 1);
            SDL_FreeSurface(rectangle);
            //affichage du compteur
            sprintf(compteur_s, "%d", compteur);
            aff_compteur= TTF_RenderText_Solid(arial, compteur_s, noir);
            position.x = width-4-aff_compteur->w;
            position.y = 2;
            rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, aff_compteur->w, aff_compteur->h, 32, 0, 0, 0, 0);
            SDL_FillRect(rectangle, NULL, vert);
            SDL_BlitSurface(rectangle, NULL, screen, &position);
            SDL_BlitSurface(aff_compteur, NULL, screen, &position);
            SDL_FreeSurface(aff_compteur);
            //SDL_UpdateRect(screen, position.x, position.y, aff_compteur->w, aff_compteur->h);
            SDL_Flip(screen);

    Pourtant je libère bien mes surfaces après utilisation.
    • Partager sur Facebook
    • Partager sur Twitter
      26 janvier 2007 à 16:44:26

      Heu, tes surfaces, il faut les libérer à la FIN du programme hein, on est bien d'accord?
      Non parce que je vois que tu la libères juste après le blit alors ça fait bizarre.

      EDIT : Pour savoir d'où peut venir ton problème de mémoire il faudrait voir ta boucle principale...
      Pour les structures, il faudrait voir :

      Sa définition, sa déclaration, son passage à la fonction, le prototype de la fonction appelée et l'utilisation.
      • Partager sur Facebook
      • Partager sur Twitter
        26 janvier 2007 à 16:48:26

        cf ci dessus (j'ai édité)
        dans mon .h
        typedef struct Coordonnees Coordonnees;
        struct Coordonnees
        {
            long x;
            long y;
        };

        dans mon main
            Coordonnees *taille;
            taille->x=301; taille->y =301;

        rien que ça (avec ouverture et fermeture de la SDL) et ça plante déjà :/ et je voit pas pourquoi..
        mais si je met
            Coordonnees *taille={"301","301"};
        ça marche :/

        Edit: pour la boucle principale:
        en gros j'ai un

        while(finished==0) //tant que le programme n'est pas fini
        {
        //creation de la particule

            is_sticky=0;
            //déplacement de la particule
            while((is_sticky==0)&((SDL_GetTicks()-tps_part)<1000)) //is_sticky=0
            {
        //verification pour savoir si la particule est collée
            //si la particule est collée, on la dessine, au passage, on agrandit le tableau si nécéssaire
            if(is_sticky==1)
            {
                //incrémentation du compteur
                compteur++;

                //dessin
                rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, 1, 1, 32, 0, 0, 0, 0);
                SDL_FillRect(rectangle, NULL, black);
                position.x = co_abs->x;
                position.y = co_abs->y;
                SDL_BlitSurface(rectangle, NULL, screen, &position);
                SDL_UpdateRect(screen, co_abs->x, co_abs->y, 1, 1);

                //affichage du compteur
                sprintf(compteur_s, "%d", compteur);
                aff_compteur= TTF_RenderText_Solid(arial, compteur_s, noir);
                position.x = taille->x-4-aff_compteur->w;
                position.y = 2;
                rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, aff_compteur->w, aff_compteur->h, 32, 0, 0, 0, 0);
                SDL_FillRect(rectangle, NULL, vert);
                SDL_BlitSurface(rectangle, NULL, screen, &position);
                SDL_BlitSurface(aff_compteur, NULL, screen, &position);
                SDL_UpdateRect(screen, position.x, position.y, aff_compteur->w, aff_compteur->h);
            }
            else{
            //deplacement de ma particule
            }
            }

        }
        J'ai simplifié le code pour éviter de coller 300 lignes de code d'un coup :)
        • Partager sur Facebook
        • Partager sur Twitter
          26 janvier 2007 à 17:01:55

          Attends, tu n'alloues pas tes SDL_Surface à chaque tour de boucle quand même???


          Mettons nous d'accord; Ta structure de base du programme c'est :

          ->AVANT la boucle principale, allocation des surfaces, initialisations blabla.

          ->On rentre dans la boucle.

          ->Puis, UNE FOIS SORTI, on libère tout ce que l'on a alloué.

          Sinon, c'est la fuite mémoire assurée, la preuve :

          Regarde ta deuxième allocation pour la surface "rectangle", elle n'est pas libérée!
          Du coup, quand tu alloues de nouveau une nouvelle surface au début de la boucle, l'ancienne prend toujours de la place en mémoire, même si tu ne pourras plus l'utiliser!!!


          EDIT :
          Pour la structure, c'est l'erreur classique, tu crées un pointeur de structure qui ne pointe sur...AUCUNE structure.
          En effet, quand tu crées un pointeur, il faut bien lui dire sur quoi il doit pointer!!!


          Coordonnees ST_taille {0,0};// La structure
          Coordonnees *PST_taille= &ST_taille;/*Le pointeur (que j'ai initialisé sur la structure ST_taille)*/
          PST_taille->x=301; PST_taille->y =301;/* Maintenant tu peux accéder à un espace mémoire qui correspond à quelque chose...*/
          • Partager sur Facebook
          • Partager sur Twitter
            26 janvier 2007 à 17:21:55

            ok, c'est réglé, je tourne aux alentours de 8Mo et s'il y a une perte memoire, elle n'est plus visible

            Sinon, pour le coup du pointeur, je comprend le truc, je teste tout ça et je reviens si ça marche pas ;)

            merci bien pour le coup de main :jap:

            edit: après un bon creusage de tête, ça marche !! Me reste plus qu'à créer encore 2-3 fonctions et ma librairie :D

            Sinon, une autre question, est-il possiblede changer la taille de l'écran au cours du programme, mon but étant de demander au gens la taille qu'ils veulent pour ensuite lancer le programme dans une fenêtre qui fait la taille demandée ?
            • Partager sur Facebook
            • Partager sur Twitter

            [C/SDL]Pointeur/Structure et Memory leak

            × 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