Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème Sdl Taille

    19 mai 2018 à 14:49:04

    Bonjour,

    j'ai actuellement un problème en SDL 1.2 : j'ai créer un tableau à double dimension avec SDL_Rect tableau[50][50] qui marche très bien mais j'ai voulu l'augmenter en [500][500] et là gros crash !

    Du coup, je voulais savoir la taille limite que l'on peut faire avec sdl rect, merci !

    ps : Je viens de faire une struture point et le tableau [500][500] ne marche pas non plus, c'est donc que la taille est trop grande mais comment faire pour passer outre ?

    -
    Edité par MrsSniperMrsniper 19 mai 2018 à 14:52:36

    • Partager sur Facebook
    • Partager sur Twitter
      19 mai 2018 à 15:29:59

      Hello,

      MrsSniperMrsniper a écrit:

      .... c'est donc que la taille est trop grande mais comment faire pour passer outre ?

      Faire de l'allocation dynamique.



      -
      Edité par edgarjacobs 19 mai 2018 à 15:30:16

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        19 mai 2018 à 19:36:53

        Salut,

        En complément de la réponse d'edgarjacobs, le problème vient exclusivement du fait que tu essaye de mettre (beaucoup) trop de données sur la pile:

        La pile représente un espace mémoire très limité (quelques Mb, au mieux... Généralement, on a de la chance si on dispose d'1 Mb), or, ton tableau [500][500] représente un espace mémoire qui correspond à ... 500 * 500 = 250 000 points.

        Or, chaque point est représenté dans la SDL par une structure qui ressemble à

        typedef {
            int x;
            int y;
        } SDL_Point;

        c'est à dire par une structure qui nécessite entre 8 et 16 bytes (en fait sizeof(int) * 2 ) bytes pour pouvoir être représentée.

        Du coup, les 250 000 points que tu veux pouvoir mettre dans ton tableau nécessitent entre 2 000 000 et 4 000 000 de bytes d'espace mémoire pour pouvoir être représentée, ce qui fait deux ou quatre fois plus que tout l'espace mémoire dont tu dispose au travers de la pile.

        Tu ne dois donc pas t'étonner si ton application crache, vu que tu essayes d'accéder à un espace mémoire auquel tu n'as pas accès!!!

        Pour résoudre ce problème, il faut que tu places tes 250 000 points (ou plus, si tu en as besoin) non pas sur la pile, mais sur le tas.  Et pour ce faire, tu dois avoir recours à l'allocation dynamique de la mémoire.

        Mais il faut être particulièrement prudent lorsque tu a recours à l'allocation dynamique de la mémoire, car tu dois impérativement veiller à rendre la mémoire au système d'exploitation dés que tu n'en a plus besoin, et, dans tous les cas, avant de perdre le pointeur qui te permet d'y accéder.  Autrement, ton application va utiliser de plus en plus de mémoire, et, à terme, utiliser toutes les ressources disponibles pour le système d'exploitation, et c'est lui (le système d'exploitation) qui en pâtira ;)

        • Partager sur Facebook
        • Partager sur Twitter
        Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
          19 mai 2018 à 20:28:34

          Ok merci pour vos réponses je vais de suite essayer ça mais j'ai une autre question : Lorsqu'il y a des fuites de mémoires causées par une allocation dynamique, vont-elles disparaîtrent si on ferme le programme ou pas ?
          • Partager sur Facebook
          • Partager sur Twitter
            19 mai 2018 à 21:15:54

            Trick question :lol:

            Les OS récents ont de bonnes chances d'effectivement récupérer la mémoire allouée lorsque le programme s'arrête, mais malgré tout ce n'est pas garanti.

            Libérer la mémoire dés que possible, c'est aussi pour empêcher ton programme de prendre trop de mémoire au fil du temps : Admettons un programme qui alloue de la mémoire régulièrement et qui tourne pendant des heures de suite, il va finir par utiliser bien plus de mémoire qu'il n'en a réellement besoin (car il n'a rien libéré au fur et à mesure), de ce fait il peut empêcher d'autres programmes de fonctionner correctement pendant ce temps.

            Libérer la mémoire au bon moment, c'est aussi une manière d'avoir un code propre et bien organisé, un code bien maitrisé avec moins de chances de faire des erreurs.

            En gros : Tu n'as pas à avoir peur de "perdre" ta mémoire, tu peux être (presque) sûr que ton OS la récupérera tout seul (au pire il suffit de reboot la machine et tout sera clean). Mais fais le quand même sans hésiter.

            • Partager sur Facebook
            • Partager sur Twitter
              19 mai 2018 à 23:26:08

              Merci pour ta réponse Gam', au faite j'ai finalement réussis avec l'allocation dynamique pour mon tableau de [500][500] mais j'ai voulu tester un peu les limites et j'ai tapé au hasard 250 000 donc ce qui fait 250 000 * 250 000 = 625 milliards et là ben ça crash à nouveau donc j'aimerai savoir quelle est la limite du fameux tas ?

              ps : A moins que ce soit mon programme qui met tellement de temps à s'éxécuter qu'on me dit qu'il réponds pas alors qu'il a juste pas terminer ? 

              -
              Edité par MrsSniperMrsniper 20 mai 2018 à 17:07:52

              • Partager sur Facebook
              • Partager sur Twitter

              Problème Sdl Taille

              × 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