Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème boucle for, trop de mémoire utilisée

    9 décembre 2018 à 20:56:51

    Bonsoir !

    Comme je crois que je n'ai pas le meilleur titre du monde, je vous explique un peu mieux avant de vous montrer le petit souci : je veux faire un jeu de rythme avec les flèches, j'ai donc créé une énumération appelée sens contenant haut, bas, droite, gauche.

    Comme à chaque sens, la flèche change de position et de rotation, j'ai fait une boucle for pour leur donner leurs gentilles caractéristiques :

      for (int i=0; i<NUM_FLECHES;i++){
        if (sensFleche[i]==sens::HAUT){
          fleches[i].setRotation(180);
          fleches[i].setPosition(LARGEUR_ECRAN/3.845f, HAUTEUR_ECRAN/2.75f);
          std::cout<<"HAUT"<<std::endl;
    
        }else if (sensFleche[i]==sens::BAS){
          fleches[i].setRotation(0);
          fleches[i].setPosition(LARGEUR_ECRAN/4.4f, HAUTEUR_ECRAN/2.05f);
          std::cout<<"BAS"<<std::endl;
    
        }else if (sensFleche[i]==sens::DROITE){
          fleches[i].setRotation(270);
          fleches[i].setPosition(LARGEUR_ECRAN/4.35f, HAUTEUR_ECRAN/1.417f);
          std::cout<<"DROITE"<<std::endl;
    
        }else if (sensFleche[i]==sens::GAUCHE){
          fleches[i].setRotation(90);
          fleches[i].setPosition(LARGEUR_ECRAN/3.87f, HAUTEUR_ECRAN/1.232f);
          std::cout<<"GAUCHE"<<std::endl;
    
        }else{
          fleches[i].setPosition(-2000, 3000);
        }

    Mais comme vous avez dû le remarquer (j'ai dû attendre que mon ordinateur chauffe pour ma part), comme il n'y a aucune condition d'activation, la boucle se répète en boucle et le terminal est rempli de GAUCHE, DROITE, HAUT, BAS en une fraction de seconde...

    Ces flèches sont créées au fur et à mesure pour laisser un côté aléatoire au jeu, et c'est un aspect que j'aimerai garder si possible, car pour éviter la surchauffe j'avais pensé à juste créer un tableau de flèches prédéfinies qui défileraient avec leur sens déjà donné.

    Du coup ma question est : est-ce que vous auriez des suggestions pour détendre mon ordinateur s'il-vous-plaît ? Ma seule contrainte (sauf si vraiment c'était une mauvaise idée dès le départ...) est vraiment le côté aléatoire, je veux bien regarder toutes les structures de données possible sinon !

    Bonne soirée !

    -
    Edité par Hornet- 9 décembre 2018 à 20:58:51

    • Partager sur Facebook
    • Partager sur Twitter
      10 décembre 2018 à 8:49:02

      Lu'!

      J'ai pas compris grand chose à ton problème. Je ne vois entre autre pas le rapport entre ta boucle qui est manifestement finie, et le fait que ça se répète à l'infini. Bref, la vérité est ailleurs.

      Autres notes concernant ton code :

      • les setters c'est pas beau (du tout),
      • les valeurs en dur non plus.
      • Partager sur Facebook
      • Partager sur Twitter

      Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

        10 décembre 2018 à 11:07:06

        Hornet- a écrit:

        Bonsoir !je veux faire un jeu de rythme avec les flèches

        Pour ce genre de chose, il faut a un moment ou à un autre, récupérer les entrées utilisateur, ce que tu ne semble pas faire.

        PS: La console ne se prête pas très bien à la programmation temps réel.

        -
        Edité par Deedolith 10 décembre 2018 à 11:08:18

        • Partager sur Facebook
        • Partager sur Twitter
          10 décembre 2018 à 15:54:26

          Hornet- a écrit:

          Mais comme vous avez dû le remarquer (j'ai dû attendre que mon ordinateur chauffe pour ma part), comme il n'y a aucune condition d'activation, la boucle se répète en boucle et le terminal est rempli de GAUCHE, DROITE, HAUT, BAS en une fraction de seconde...

          -
          Edité par Hornet- il y a environ 18 heures


          De ce que je comprend c'est le 'temps' qui ne fonctionne pas ( toute les touches qui s'affichent en une fraction de secondes ). Ca c'est parce que ton ordinateur fait plusieurs milliers voir millions d'operations par secondes donc ta boucle for se passe dans le temps d'un clin d'oeil.. pour 'ralentir ton ordinateur' tu devra gerer le temps : Recuperer le temps actuel - temps d'une boucle et si cette difference est plus grande qu'un seuil alors on affiche la fleche .. en gros :


          END = 0
          COUNTER = 0
          TIME_COUNTER = 0
          
          BOUCLE (
              
              START = NOW
          
              ELAPSED = START - END
              TIME_COUNTER += ELAPSED
          
              IF TIME_COUNTER > 0.5 ( seuil de 2 fois par  secondes )
                  afficher_fleche(COUNTER++)
                  TIME_COUNTER = 0
          
              END IF
          
              END = NOW
          
          )
          • Partager sur Facebook
          • Partager sur Twitter
            10 décembre 2018 à 16:11:04

            De nos jours, on est plutôt du côté du milliard que du million d'opérations par seconde (les ordinateurs des années 60).

            -
            Edité par michelbillaud 10 décembre 2018 à 16:29:20

            • Partager sur Facebook
            • Partager sur Twitter
              10 décembre 2018 à 20:19:27

              Bonsoir ! Merci pour vos réponses

              Ksass`Peuk : j'ai essayé de regarder ailleurs en commentant et décommentant plusieurs petits bouts, mais même en étant privé de ma fonction generationFleche ou verifFleche ou autres relatifs, j'ai toujours cette espèce de boucle infinie... 

              En vérifiant mes accolades, j'ai remarqué que mon "for" était dans ma boucle "while window.isOpen())", alors j'ai pensé que ça venait de là, ce qui rejoint les dires de Zérotisme et Michelbillaud sur le nombre important d'opérations par seconde d'un ordinateur.

              Mais j'ai toujours ce même souci...

              Pour les setters, je les utilise car ils viennent directement de la librairie SFML, est-ce que je devrais trouver un autre moyen plus euh joli ? Pour les valeurs en dur, je n'ai pas d'excuse

              Deedolith : Ce n'était qu'un bout de code, les entrées sont bien gérées ailleurs dans le programme mais je ne pensais pas que c'était nécessaire de le mettre dans le sujet comme le souci ne venait pas de là

              Zérotisme : Je vais essayer ça, ça me semble mon dernier recours, mais une chose qui me perturbe là-dedans (mais je ne suis pas sûre que ce soit la même chose), c'est qu'avant de commencer ce jeu j'avais suivi un livre "Beginning C++ with game programming", et dans ce livre, il avait utilisé un booléen "acceptInput" pour que l'utilisateur ne puisse pas laisser la touche appuyée pour tricher, donc c'était aussi censé ralentir la génération des sprites, or dans son programme il y a le même souci que le mien...

              Je vais essayer quand même, ce sera utile dans tous les cas, merci !

              -
              Edité par Hornet- 10 décembre 2018 à 20:25:41

              • Partager sur Facebook
              • Partager sur Twitter
                11 décembre 2018 à 9:30:24

                Au pire, mets tout ton code, si ce n'est pas trop long, sinon fais un coliru?
                • Partager sur Facebook
                • Partager sur Twitter

                « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
                D. Mendeleïev

                Problème boucle for, trop de mémoire utilisée

                × 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