problème avec tableaux de structure

problème avec tableaux de structure

by Hugo Charles Fabrègues -
Number of replies: 2

Bonsoir,

J'ai un problème avec un programme dont voici un bout :

struct entite {
        string question;
        int nombre;
    };

int main()
{
    entite chats;
    chats.question = "Nombre de chats";
    
    entite chiens;
    chiens.question = "Nombre de chiens";
    
    entite mois;
    mois.question = "Combien de mois dure la simulation";
    
    entite animaux;
    animaux.question = "Quel est le nombre d'animaux à ajouter si une population s'est éteinte";
    
    vector<entite> simulation ({
        chats, chiens, mois, animaux
    });
    
    for(auto& i : simulation){
        i.nombre = demander_nombre(i.question);
    }
    
    cout << chats.question << " : " << chats.nombre << endl;
    cout << chiens.question << " : " << chiens.nombre << endl << endl; 


Pour information, la fonction demander_nombre retourne un entier.

Je voudrais que lorsque j'itère sur le tableau "simulation" le champ "nombre" de chaque élément soit modifié. 

Au lieu de ça,  l'affichage de "chats.nombre" et de  "chiens.nombre" donne toujours zéro.

Voyez-vous où se situe le problème?

Merci pour votre réponse, et bonne soirée. 



In reply to Hugo Charles Fabrègues

Re: problème avec tableaux de structure

by Cédric Viaccoz -
Bonsoir,

Le problème vient du fait que le constructeur de vector (la ligne " vector<entite> simulation ({chats, chiens, mois, animaux});"  va créer une copie parfaite de chacune des struct entites que tu lui as donné dans cette ligne. Ce qui fait que la struct entites de nom chat n'a plus aucun lien avec la struct stockée à l'indice 0 dans ton vecteur simulation (malgré le fait qu'elles soient identiques en tout point avant la boucle for).
Si tu remplaces les deux dernières lignes de ton programme par les suivantes : 

cout << simulation[0].question << " : " << simulation[0].nombre << endl;
cout << simulation[1].question << " : " << simulation[1].nombre << endl;

Ton programme fonctionne correctement.

A noter qu'il y a un autre moyen de contourner ce problème, mais cela nécessite l'utilisation de pointeurs, que vous n'avez encore pas vu en cours pour le moment. En guise de référence et si tu souhaites revenir sur ce problème plus tard, je me permets tout de même de mettre ici une autre solution à ton problème qui permettrait d'utiliser les variables chats et chiens avec les modifications faites dans le vecteur répercutées correctement : 
 
vector<entite*> simulation ({
        &chats, &chiens, &mois, &animaux
 });
    
for(auto i : simulation){
        i->nombre = demander_nombre(i->question);
}
   
cout << chats.question << " : " << chats.nombre << endl;
cout << chiens.question << " : " << chiens.nombre << endl << endl;