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 :

Probleme avec constructeur.


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut Probleme avec constructeur.
    Bonjour je suis débutant en c++ et je suis en train de programmer le "jeu de la vie". J'ai réussi à le programmer sans encapsuler mes données mais ce n'était pas vraiment le but du projet. Alors j'ai créer une classe Tableau et j'ai fourni ses méthodes, et maintenant rien ne va plus. À la création de mon objet tableau, mes valeurs ne s'initialise plus comme il se doit, et l'affichage n'est vraiment pas correct.

    Voici ma classe tableau:
    Code : 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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    *
    *Classe qui représente un Tableau
    *
    *
    *
    *
    *
    */
        #include "Tableau2.hpp"
     
        const int NBRELIGNES = 24;
        const int NBRECOLONNES = 80;
     
     
        //Constructeur
        //Initialisation par défaut
        Tableau :: Tableau()
        {
            for(int i = 0 ; i < NBRELIGNES ; i++)
            {  for(int j = 0 ; j < NBRECOLONNES ; j++)
               {
                    grille[i][j] == false;
                    cout << grille[i][j];
                    if(0 == j%80)
                    cout << endl;
     
               }
            }
     
        }
     
        Tableau :: Tableau(const Tableau& tab)
        {
            *this = tab;
            /*for(int i = 0 ; i < NBRELIGNES ; i++)
            {  for(int j = 0 ; j < NBRECOLONNES ; j++)
               {
                    bool etat = grille[i][j];
                    tab.setEtat(i , j , etat);
               }
            }*/
        }
     
        //Destructeur
        Tableau :: ~Tableau()
        {
            delete [] grille;
        }
     
        //accesseurs
        bool Tableau :: getEtat(int i , int j) const
        {
            return grille[i][j];
        }
     
        void Tableau :: setEtat(int i , int j , bool etat)
        {
            grille[i][j] = etat;
     
        }

    et mon main...
    Code : 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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
     
    #include <iostream>
    #include <fstream>
    #include "tableau2.hpp"
    //#include "PortableSleep.hpp"
     
    using namespace std;
     
     
     
    //Prototypes
    void ouvrirFichier(Tableau& tab);
     
    void afficherTableau(Tableau& tab);
     
    int nombreVoisins(int i, int j, Tableau& tab);
     
    void modifierTableau(Tableau& tab1 ,Tableau& tab2);
     
     
    const int NBRELIGNES = 24;
    const int NBRECOLONNES = 80;
     
    int main()
    {
     
        Tableau grille;
        Tableau grilleTemp;
     
        ouvrirFichier(grille);
     
        int i = 0 ;
        while( i < 2){
     
     
        afficherTableau(grille);
        modifierTableau(grille ,grilleTemp);
        i++;
     
        }
     
        system("Pause");
        return 0;
    }
     
     
    void afficherTableau(Tableau& tab)
    {
        for (int i = 0 ; i < NBRELIGNES ; i ++)
        {   for (int j = 0 ; j < NBRECOLONNES ; j++)
            {
              if (j%NBRECOLONNES == 0)
              {
     
                    cout << endl;
              }
              else
              {
                    if (tab.getEtat(i,j) == true)
                    {
                        cout <<i<<j;
                        cout << '+' ;
                    }
                    if (tab.getEtat(i,j) == false)
                    {
                        cout << ' ' ;
                    }
              }
            }
        }
    }
     
     
    //Ouvrir le fichier et initialiser les données dans le tableau
     
    void ouvrirFichier(Tableau&  tab)
    {
     
        ifstream fichier ("test.txt", ifstream::in);
     
     
        while(!fichier.eof())
        {
     
            int i1;
            int i2;
            fichier >> i1 >> i2;
     
            tab.setEtat(i1,i2,true);
     
        }
    }
    /*
    *Modidie le tableau pour passer à la prochaine étape
    *du jeu de la vie en passant par un tableau intermédiaire.
    *
    */
    void modifierTableau(Tableau& tab1, Tableau& tab2)
    {
        tab2 = Tableau(tab1);
     
        for (int i = 0 ; i < NBRELIGNES  ; i++)
        {   for (int j = 0 ; j < NBRECOLONNES  ; j++)
            {
                if(tab1.getEtat(i,j)== false && nombreVoisins(i,j,tab1) == 3)
                {
                    tab2.setEtat(i,j,true);
                }
                if(tab1.getEtat(i,j) == true && !(nombreVoisins(i,j,tab1) == 2 || nombreVoisins(i,j,tab1) == 3 ))
                {
                    tab2.setEtat(i,j,false);
                }
     
            }
        }
     
        tab1 = Tableau(tab2);
     
    }
    int nombreVoisins(int i, int j, Tableau& tab)
    {
        int nombreVoisins = 0;
        if (tab.getEtat(i-1 , j-1) == true)
        {
            nombreVoisins ++;
        }
        if (tab.getEtat(i-1 , j) == true)
        {
            nombreVoisins ++;
        }
        if (tab.getEtat(i-1 , j+1) == true)
        {
            nombreVoisins ++;
        }
        if (tab.getEtat(i , j-1) == true)
        {
            nombreVoisins ++;
        }
        if (tab.getEtat(i , j+1) == true)
        {
            nombreVoisins ++;
        }
        if (tab.getEtat(i+1 , j-1) == true)
        {
            nombreVoisins ++;
        }
        if (tab.getEtat(i+1 , j) == true)
        {
            nombreVoisins ++;
        }
        if (tab.getEtat(i+1 , j+1) == true)
        {
            nombreVoisins ++;
        }
     
        return nombreVoisins;
    }
    Le programme va chercher les données dans un fichier test.txt
    Alors merci à l'avance!

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Il semble que tu ais oublié d'allouer ta grille avec un new.

    MAT.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut
    À défaut d'avoir l'air vraiment incompétent...est-ce que tu pourrias me donner la syntaxe parce que ca ne semble pas vouloir fonctionner lorsque je le fais...

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Dans le corps de ta classe tableau, tu t'adresses à grille. A la compilation devrait t'être dit que cet objet est inconnu.

    Il s'agit en l'occurrence d'une instance de cette classe (mais comment la classe le saurait-elle ?). Mais pas n'importe laquelle : elle-même... Bref, ce n'est pas gérable. C'est ce qu'on appelle une "mise en abîme". :-)

    Tu dois définir comme variable membre privée un tableau traditionnel, et travailler dessus.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut
    D'accord je comprends...

    Mais en fait je ne l'avais pas afficher, mais dans mon tableau.hpp, j'ai une variable privé que j'avais déjà nommé grille dans le but de l'utiliser.
    Code : 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
    /*
    *
    *
    *Classe qui représente un Tableau
    *
    *
    */
     
    #ifndef  TABLEAU_HPP_
    #define TABLEAU_HPP_
     
    #include <iostream>
     
     
    using namespace std;
     
    class Tableau
    {
        public:
     
            //Constructeur
            Tableau();
            Tableau(const Tableau& tab);
     
            //Destructeur
            ~Tableau();
     
            //accesseurs
            bool getEtat(int i , int j) const;
            void setEtat(int i , int j , bool etat);
     
        private:
     
            bool  grille[24][80];
     
     
    };
     
    #endif

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Et que se passe-t-il, précisément, à la compilation ?

    Tu as des messages d'erreur à nous donner ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut
    En fait, le tout compile, c'est juste que mon constructeur est censé initialiser toutes les cases de ma grille à false. Et si j'essaye d'utiliser ma méthode afficher c'est vraiment n'importe quoi qui affiche... Pourtant j'ai fait les tests pour savoir si le fichier chargeait bien dans le tableau ( peut être que c'est comment je passe mes paramètres.?..) et tout semble correct...

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Quand tu débogues dans le constructeur, ça se passe bien, ou pas ?

  9. #9
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Ah si grille est un tableau déclaré comme ça il ne faut pas que tu fasses de delete dans ~Tableau du coup.

    MAT.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut
    Au debugage mon constructeur fonctionne bien...

  11. #11
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    le delete dans ton destructeur est faux comme le dis Mat007. delete c'est pour libérer ce qui est alloué avec new ce qui n'est pas ton cas, le tableau sera libéré pour toi automatiquement

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut
    Ok désolé, en fait il y a une petite erreur dans le .hpp que j'ai envoyé, dans le constructeur il n'y a pas de cout... En fait c'était seulement pour debuger...

    Le constructeur est là seulement pour initialiser les cases de mon tableau....

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par hegros Voir le message
    le delete dans ton destructeur est faux comme le dis Mat007. delete c'est pour libérer ce qui est alloué avec new ce qui n'est pas ton cas, le tableau sera libéré pour toi automatiquement
    Mais en quoi cela compromet-il l'intégrité des données ?
    Tant que l'objet n'est pas détruit, cela n'a pas d'incidence. Et avant qu'il soit détruit, les données du tableau devraient être consultables.

  14. #14
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par oodini Voir le message
    Mais en quoi cela compromet-il l'intégrité des données ?
    Tant que l'objet n'est pas détruit, cela n'a pas d'incidence. Et avant qu'il soit détruit, les données du tableau devraient être consultables.
    Pour le problème initial je ne sais pas, c'est juste une remarque sur le code.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut
    Merci pour le delete, je ne le savais pas... Mais ce la ne semble pas régler mon problème...

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par watiero Voir le message
    Au debugage mon constructeur fonctionne bien...
    Et si dans le main, juste après la construction de l'objet, tu fais un get sur une cellule quelconque du tableau, c'est bon ou pas ?

    Si oui, c'est que ça ne vient pas du constructeur.

  17. #17
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Ton constructeur de copie est foireux.
    Si tu détruis une copie, tu détruis l'original avec...
    Et ta fonction ModifierTableau crée une copie temporaire...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    J'ajouterai que tu devrais, dans tes get et set, t'assurer que les indices sont fournis sont bien compris entre les bornes. Mais bon, peut-être comptais-tu le faire dans les finitions.

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut
    Ok! Merci beaucoup!!

    Je vais analyser et réflechir à tout ca! En espérant ne pas avoir à vous poser plus de questions à ce sujet!!

    Merci encore.

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

Discussions similaires

  1. probleme avec constructeur
    Par Ronan_ dans le forum Débuter
    Réponses: 20
    Dernier message: 07/05/2014, 14h42
  2. Probleme avec constructeur
    Par watiero dans le forum C++
    Réponses: 8
    Dernier message: 12/02/2008, 21h16
  3. Probleme avec constructeur surchargé
    Par dr971 dans le forum C++
    Réponses: 3
    Dernier message: 04/04/2007, 11h16
  4. Problème avec le constructeur SAXParser()!
    Par L4BiN dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 21/06/2006, 09h32
  5. Réponses: 13
    Dernier message: 02/02/2005, 00h21

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