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 :

Boucle infinie malgré incrémentation


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 9
    Par défaut Boucle infinie malgré incrémentation
    Bonjour,

    Je suis confrontée à un problème assez étrange : j'ai une boucle for, à l'intérieur, se trouve un simple affichage, et pourtant... Elle ne s'incrémente jamais. A priori, c'est pas un problème d'options de compilation (j'ai essayé la batterie d'options au début, puis plus rien et le résultat est le même.
    Une autre chose : la méthode next_season() semble effacer la valeur de v. Mais je ne comprends pas pourquoi. Et j'ai googlé, sans rien trouver.

    Avez-vous une idée de ce qui se passe ? Je vous joins les bouts de code incriminés.

    Code main.cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    int main(int, char **)
    {
       Population P;
     
       P.display(-1);
     
       for(int v = 1 ; v < 10 ; v++)
       {
          P.display(v);
          P.next_season();
          std::cout << "v = " << v << std::endl;
       }
     
       return 0;
    }

    Code population.cpp:display : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void Population::display(int v)
    {
       if(v == -1)
       {
          std::cout << "Total number of rabbits:\t" << total << std::endl;
          std::cout << "Males:\t" << partition[3] + partition[4] + partition[5] << "\tFemales:\t" << partition[0] + partition[1] + partition[2] << std::endl;
       }
       else
       {
          for(int i = 0 ; i < v ; i++)
          {
             std::cout << "Age " << i << ": " << partition[i+6] << std::endl;
          }
       }
    }

    Code population.cpp:next_season : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Population::next_season()
    {
       /* First: aging */
       /* After month 185, all rabbits are dead */
       for(int k = 185 ; k > 5 ; k--)
       {
          partition[k+1] = partition[k];
       }
       partition[6] = 0; 
    }

    P.S. Patapé, je suis pas très expérimentée.

  2. #2
    Membre actif
    Avatar de fmdao
    Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 90
    Par défaut
    Quels sont les attributs de ta classe "Population" ?

    Où se trouve le tableau "partition" ?

    C'est un tableau -> vérifie les bornes !

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Iran

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Par défaut
    quelle est le première valeur de "partition"?

  4. #4
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 9
    Par défaut
    Header de la classe Population :
    Code population.hpp : 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
    #ifndef _POPULATION_HPP_
    #define _POPULATION_HPP_
     
    #include "rabbit.hpp"
     
    class Population
    {
      private:
       long total;
     
       /* Array. Contains:
        * 0: healthy adult female rabbits ** Females that will get pregnant **
        * 1: healthy child female rabbits 
        * 2: sick female rabbits ** Female that won't get pregnant anymore and then, die **
        * 3: healthy male rabbit ** Just to verify that there is actually male rabbit. ** 
        * 4: healthy child male rabbits
        * 5: sick male rabbit    ** To make the testing easier **
        * 6 -> 186 : rabbits from 0 to 15 years
        */
       long partition[186]; 
     
      public:
       Population();
      ~Population();
     
      long get_total();
      long * get_partition();
      void display(int i);
      void add_rabbit(Rabbit rabbit);
      void delete_rabbit(long partition_index_gender, long partition_index_age);
      void next_season();
    };
     
    #endif


    Header de la classe Rabbit :
    Code rabbiot.hpp : 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
     
    #ifndef _RABBITS_HPP_
    #define _RABBITS_HPP_
     
    class Rabbit{
     
      public: 
       bool gender;
       int age;
       bool disease; /* Rabbits can only get myxomatosis */
     
       /* Constructors */
       Rabbit(unsigned long random);
      ~Rabbit();
       Rabbit & operator =(const Rabbit & rabbit);
    };
     
    #endif

    Initialisation de partition :
    Code population.cpp : 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
     
    Population::Population()
    {
       total = 0;
     
       for(int i = 0 ; i < 186 ; i++)
       {
          partition[i] = 0;
       }
     
       srand(time(NULL));
     
       Rabbit r1(rand());
       Rabbit r2(rand());
     
     
       while(r1.gender == r2.gender)
       {
             r1 = Rabbit(rand());
       }
          add_rabbit(r1);
          add_rabbit(r2);
    }
     
     
    void Population::add_rabbit(Rabbit rabbit)
    {
       /* If rabbit is a female */
       if(rabbit.gender)
       {
          partition[1]++;
       }
       else
       {
          partition[4]++;
       }
     
       partition[6]++;
     
       total++;
    }

    Je précise : je sais que d'un point de vue scientifique, le code actuel est faux. J'ai l'intention de le corriger quand j'aurai plus ce bug.

  5. #5
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonjour,
    La seule chose qui me saute aux yeux, c'est que tu vas taper à l'extérieur de ton tableau partition.

    Pour un tableau TYPE tab[MAX];, les indexes valides sont dans l'intervalle [0, MAX[.
    Autrement dit, tab[MAX] correspondrait à un élément situé juste après le dernier du tableau.
    Dans le meilleur des cas, cela ne peut avoir aucune conséquence (si la zone mémoire requise n'est pas utilisée ailleurs) ; dans le pire des cas, cela peut faire planter le programme (le PC ?).

    Tu définis ton tableau ainsi : long partition[186];, mais à chaque fois que tu veux accéder à tous les éléments, tu appelles (directement ou indirectement) partition[186].
    Très mauvais...

    Autre chose, c'est un avis personnel, mais je pense que tu devrais utiliser une constante (statique) nommée à la place d'une constante anonyme pour la taille de ce tableau.
    Ça devrait augmenter la lisibilité du code, mais en plus, si jamais tu dois modifier cette valeur, tu n'auras à le faire qu'à un seul endroit

    [Edit]
    Tu peux aussi utiliser des constantes nommées pour les indexes correspondant aux catégories de lapins, et pour indiquer le début et la fin de la plage des « lapins de 0 à 15 ans ».
    [/Edit]

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 9
    Par défaut
    Alors, déjà merci pour tes avis sur la lisibilité du code. Ça me sera utile.

    Là où je suis surprise, c'est quand tu dis que j'appelle partition[186]. Techniquement, je ne vois pas où je le fais. Je m'arrête toujours à partition[185]. Enfin, je crois ? Des inférieurs stricts dans les boucles, confirmés par le fait que je n'ai pas de segfault dans aucune situation. (J'ai testé le programme sur une machine virtuelle Ubuntu et trois machines physiques respectivement Windows 7, Mac OS X et CentOS). Si j'avais une segfault potentielle, j'aurai dû la voir passer au moins une fois, non ?

  7. #7
    Membre éprouvé Avatar de Xtrem_Voyageur
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2009
    Messages : 85
    Par défaut
    Là où je suis surprise, c'est quand tu dis que j'appelle partition[186]. Techniquement, je ne vois pas où je le fais. Je m'arrête toujours à partition[185]. Enfin, je crois ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       for(int k = 185 ; k > 5 ; k--)
       {
          partition[k+1] = partition[k];  
       }
    k+1 = ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Boucle Infinie] pour un menu
    Par NhyMbuS dans le forum C++
    Réponses: 5
    Dernier message: 20/07/2005, 09h14
  2. symptome de la boucle infinie dans une requete
    Par ouam81 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/05/2005, 12h10
  3. Réponses: 15
    Dernier message: 24/05/2005, 08h34
  4. [Socket] Pb de boucle infinie
    Par Myogtha dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 10/06/2004, 14h10
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 00h04

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