Partage
  • Partager sur Facebook
  • Partager sur Twitter

Classe Tableau : le programme arrête de fonctionner

    23 mars 2008 à 19:39:24

    Bonjour à tous,

    J'essaye depuis un moment de coder la classe Tableau. J'alloue dans le tas chaque nouvel élément du tableau, avec un indice, une valeur, et un pointeur sur le nouvel élément. J'ai d'ores et déjà rédigé la méthode "saisir" et "afficher". Le compilo ne détecte pas d'erreur, mais le programme s'interrompt à l'exécution. Je pense que ça vient de mon utilisation de "this" que je maitrise mal.

    Voici donc le code :

    UnTableauEntiers.cpp
    1. #include <iostream>
    2. using namespace std;
    3. class UnTableauEntiers {
    4.       private :
    5.               int saValeur;
    6.               int sonIndice;
    7.               UnTableauEntiers* pt;
    8.       public :
    9.              UnTableauEntiers(){
    10.                                 UnTableauEntiers* tmp;
    11.                                 tmp = new UnTableauEntiers;
    12.                                 (*tmp).saValeur=0;
    13.                                 (*tmp).sonIndice=0;
    14.                                 (*tmp).pt=NULL;
    15.                                 }
    16.              ~UnTableauEntiers(){}
    17.              void afficheToi(){
    18.                   UnTableauEntiers* tmp;
    19.                   if (this==NULL)
    20.                      cout << "Le Tableau est vide." << endl;
    21.                   else {
    22.                        if ((*this).pt!=NULL) {
    23.                                       tmp=(*this).pt;  
    24.                                       cout <<"Indice : "<<(*tmp).sonIndice << " - " << "Valeur : " << (*tmp).saValeur << endl;
    25.                                       while (tmp!=NULL) {
    26.                                             cout <<"Indice : "<<(*tmp).sonIndice << " - " << "Valeur : " << (*tmp).saValeur << endl;
    27.                                             tmp=(*tmp).pt;
    28.                                              }          
    29.                                       }
    30.                        }
    31.                    }
    32.              void saisir(){
    33.                   int TAILLE;
    34.                   UnTableauEntiers* temp;
    35.                   cout << "Quelle taille voulez vous allouer? : ";
    36.                   cin>>TAILLE;
    37.                   if (TAILLE<0)
    38.                      cout << "Une taille negative ne rime a rien..." << endl;
    39.                   if (TAILLE==0)
    40.                      this->pt=NULL;
    41.                   if (TAILLE>0) {
    42.                      temp=new UnTableauEntiers;
    43.                      (*temp).sonIndice=0;
    44.                      cout << "Entrez la valeur du 1er element : " << endl;
    45.                      cin >> (*temp).saValeur;
    46.                      this->pt=temp;                
    47.                      for (int i=1; i<TAILLE; i++) {
    48.                           (*temp).pt=new UnTableauEntiers;
    49.                           temp=(*temp).pt;                          
    50.                           (*temp).sonIndice=i;
    51.                           cout << " \nEntrez la valeur de l'indice " << (*temp).sonIndice << " : ";
    52.                           cin >> (*temp).saValeur;
    53.                           (*temp).pt=NULL;
    54.                          }
    55.                      }
    56.                    }
    57. };


    TestUnTableauEntiers.cpp
    1. #include <iostream>
    2. #include <cstdlib>
    3. #include "UnTableauEntiers.cpp"
    4. using namespace std;
    5. int main (){
    6.     UnTableauEntiers leTableau;
    7.     leTableau.saisir();
    8.     leTableau.afficheToi();
    9.     system("PAUSE");
    10.     return 0;
    11. }


    Merci de l'aide.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      23 mars 2008 à 20:21:34

      ZOMG
      c'est quoi ce code cette horreur ?
      Tu na rien compris aux constructeurs,à this (aux classes en générale) et la conception de ta class est foireuse.

      Revoi tout ca , après on verra
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        23 mars 2008 à 20:24:53

        Davidbrcz a raison, revois la théorie. Sinon deux choses :
        -> pas de NULL en C++, mais 0 (zéro).
        -> un new = un delete dans le code. Je vois un new et zéro delete. Caymal.
        • Partager sur Facebook
        • Partager sur Twitter
          23 mars 2008 à 21:14:19

          Citation : Davidbrcz

          ZOMG
          c'est quoi ce code cette horreur ?
          Tu na rien compris aux constructeurs,à this (aux classes en générale) et la conception de ta class est foireuse.

          Revoi tout ca , après on verra



          Merci de l'aide on dirait mon prof. Ca donne envie d'apprendre...
          M'en vais revoir ça, et donc trouver mon problème...seul.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            23 mars 2008 à 21:25:57

            Tu sais, je crois pas qu'il a dit ça car il ne voulait pas t'aider. Comme c'est vraiment la théorie qu'il te manque autant (re)lire le cours proposé ici même. Si tu as une question sur un point précis on essayera bien évidement de t'aider comme on le peut. ;)
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              23 mars 2008 à 22:12:27

              J'avais pas vu.
              Il inclu même un .cpp
              C'est tout est qui à revoir, pas que les classes.
              • Partager sur Facebook
              • Partager sur Twitter
                23 mars 2008 à 22:49:57

                Citation : hiura

                -> pas de NULL en C++, mais 0 (zéro).



                Tu peux me montrer d'où tu tiens cette énormité stp ?
                • Partager sur Facebook
                • Partager sur Twitter
                  23 mars 2008 à 22:54:44

                  Citation : hiura

                  Tu sais, je crois pas qu'il a dit ça car il ne voulait pas t'aider. Comme c'est vraiment la théorie qu'il te manque autant (re)lire le cours proposé ici même. Si tu as une question sur un point précis on essayera bien évidement de t'aider comme on le peut. ;)



                  Oui, je vais relire. M'enfin il est super encourageant. J'ai un prof qui enseigne n'importe comment, j'arrive en cours, je suis stressé, il fait peur, il sait pas enseigner. J'essaye quand bien même de m'en sortir et de faire les exos. Là, je bloque, je me dis : "ah tiens, je vais aller sur le sdz pour voir s'ils peuvent m'aider", et au lieu de dire que c'est faux, et ce qui ne va pas, j'ai le droit à "c'est quoi cette horreur". Ca donne envie d'apprendre le C++.

                  Je vois pas en quoi ça pose un problème d'inclure un .cpp, au lieu de le dire...
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    24 mars 2008 à 0:22:02

                    @dangerous : cette "énormité" comme tu le dis, je la sors directement d'un livre incontestable. ;)

                    Citation : LE LANGAGE C++ - Bjarne Stroustrup - §5.1.1 Zéro

                    Zéro (0) est une int. En raison des conversion standards (§C.6.2.3), 0 peut être utilisé comme constante de tout type intégral (§4.1.1), virgule flottante, pointeur ou pointeur de membre. Le type de 0 e$sera ensuite déterminé par le contexte. 0 sera généralement (mais pas nécessairement) représenté par le modèle de bit tous nuls de la taille appropriée.

                    Aucun objet n'est alloué avec l'adresse 0. Par conséquent, 0 se comporte comme une littérale pointeur, indiquant qu'un pointeur ne fait pas référence à un objet.

                    En langage C, il arrivait fréquemment qu'une macro NULL soit définie pour représenter le pointeur 0. En C++, un contrôle de type plus sérieux rend moins problématique l'utilisation du 0 normal, plutôt que de toute macro NULL. Le nombre de problèmes est ainsi considérablement réduit. Si vous pensez devoir définir NULL, utilisez

                    1. const int NULL = 0;


                    Le qualificatif const (§5.4) évite toute redéfinition accidentelle de NULL et permet l'utilisation dans tous les cas où une constante est requise.


                    Si tu veux des exemple d'utilisation regarde, par exemple, les codes sources des exemples de Qt.

                    @Greenleesh : Pour this, http://cpp.developpez.com/faq/cpp/index.php?page=classes#DEFINITION_this (mais lis le cours de m@teo21 aussi, c'est un peu plus explicite).
                    Si on inclus pas les *.cpp c'est pour éviter les erreurs de multiples définitions.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 mars 2008 à 1:31:13

                      <hs>Il y a deux écoles pour le 0 vs NULL, et des gurus dans les deux camps. Ne prenez pas le chou aux débutants là dessus. Si c'était aussi simple que cela, un valeur dédiée n'apparaitrait pas dans le C++0x... :/
                      </>

                      Bon, sinon j'avoue que je n'ai pas cherché à lire le code. Pourquoi ? A cause de l'indentation irrégulière et exagérée. Certains éditeurs (tous ceux que j'ai utilisés jusqu'à présent (VC et vim)) permettent de la reprendre automatiquement. Corrige ça, et édite ton message STP.

                      PS: les codes d'entrée/sortie n'ont rien à faire dans le code d'une classe. D'autant plus quand ils sont "interactifs".
                      Ta classe devra : contenir de quoi la construire (à un taille donnée), de quoi la détruire (pour libérer ses ressources), de quoi la remplir, de quoi accéder à son contenu (vu que c'est son seul véritable rôle),
                      Et enfin ne pas oublier de spécifier comment se passent (ou pas) les copies (bienvenu en C++, où cet aspect est assez critique)
                      • Partager sur Facebook
                      • Partager sur Twitter
                      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                      Anonyme
                        24 mars 2008 à 9:54:59

                        Citation : Greenleesh

                        1. if (this==NULL)
                        2.         cout << "Le Tableau est vide." <<endl;

                        this est le pointeur vers ton objet... si il est nul l'objet n'existe pas!!! :p

                        deuxiemement, le (*this).fonction() est mauvais... met plutot this->fonction() pour etre plus corect... mais c'est inutile d'utiliser this: fonction() suffit ^^

                        dernierement on inclut pas un .cpp dans le .h
                        il faut inclure le .h dans le .cpp et dans le fichier qui utilise tes tableaux (main.cpp part exemple)
                        puis il faut inclure le .h est le .cpp dans le projet qui les utilisent

                        bon teste comme ça est donne nous les résultats...
                        @+
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          24 mars 2008 à 11:19:56

                          Citation : youyou

                          deuxiemement, le (*this).fonction() est mauvais... met plutot this->fonction() pour etre plus corect...


                          C'est la même chose (*this).f() et this->f() alors pourquoi l'un serait moins bien que l'autre?
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            25 mars 2008 à 7:10:10

                            this->f() est plus facile a lire
                            • Partager sur Facebook
                            • Partager sur Twitter
                              25 mars 2008 à 8:12:51

                              Plus court on va dire, mais ce n'est pas pour ça que "(*this).fonction() est mauvais". Ca reste à 100% correct mais oui, this->fonction() me parait plus simple.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                25 mars 2008 à 10:52:07

                                Il m'a fait peur un instant. :-°
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  25 mars 2008 à 13:23:21

                                  Citation : greenleesh

                                  J'ai un prof qui enseigne n'importe comment, j'arrive en cours, je suis stressé, il fait peur, j'ai envie de pleurer, il sait pas enseigner.



                                  Je pense que tu devrais te remettre en question avant de critiquer nos avis professionels sur ta question.

                                  Va bosser, t'as du pain sur la planche.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    25 mars 2008 à 13:24:15

                                    Citation : Greenleesh

                                    Merci de l'aide on dirait mon prof. Ca donne envie d'apprendre...
                                    M'en vais revoir ça, et donc trouver mon problème...seul.


                                    Oui bah tu ferais mieux de sortir de ta grotte ! C'est pas avec cette mentalité que tu vas avancer !!

                                    Donc pour résumer ton code est clairement à chier. Tu peux reprendre les bases du C, voir les bases de l'algo. Parce que là, franchement.......
                                    Ca te dit pas le VISUAL BASIC comme langage ? C'est accessible ça au moins.

                                    Sinon pour la critique constructive : supprime ton programme et recommence !
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      25 mars 2008 à 13:28:59

                                      Citation : Suck my void

                                      Citation : Greenleesh

                                      Merci de l'aide on dirait mon prof. Ca donne envie d'apprendre...
                                      M'en vais revoir ça, et donc trouver mon problème...seul.


                                      Oui bah tu ferais mieux de sortir de ta grotte ! C'est pas avec cette mentalité que tu vas avancer !!

                                      Donc pour résumer ton code est clairement à chier. Tu peux reprendre les bases du C, voir les bases de l'algo. Parce que là, franchement.......
                                      Ca te dit pas le VISUAL BASIC comme langage ? C'est accessible ça au moins.

                                      Sinon pour la critique constructive : supprime ton programme et recommence !



                                      Entièrement d'accord, implémenté n'importe comment, attitré comme ça, templater d'une autre facon. Hiérarchise moi tout ça !!!
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        25 mars 2008 à 13:30:54

                                        Citation : Ratarddaboss

                                        Citation : greenleesh

                                        J'ai un prof qui enseigne n'importe comment, j'arrive en cours, je suis stressé, il fait peur, j'ai envie de pleurer, il sait pas enseigner.



                                        Je pense que tu devrais te remettre en question avant de critiquer nos avis professionels sur ta question.

                                        Va bosser, t'as du pain sur la planche.


                                        Non mais t'as totalement raison. Faut absolument qu'il se remette en question, qu'il apprenne à faire un projet, et qu'il voit au moins les bases du C ++ !!!!!

                                        Parce que là débarquer sans rien connaitre pour qu'on lui mâche le travail, non mais ho §
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          25 mars 2008 à 13:35:33

                                          Franchement vous abusez les gars là :/ faut bien aider les débutants non ?

                                          Bon c'est vrai qu'il débarque vraiment ici avec plein de problème, mais rien n'est perdu, même si il reste beaucoup beaucoup de travail !
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            25 mars 2008 à 14:24:00

                                            Suck my void, Retarddaboss, vous avez franchement intérêt de vous tenir à carreau. Vous venez de vous inscrire, 2 messages chacun à votre actif et c'est pour agresser les gens. Secundo, votre IP est quasi identique, à 1 chiffre près. Vous avez du bol que ça renvoie à un IUT à Lyon...Je suspecte le multi, mais je suspecte également deux gamins qui ont veulent faire leur caïd. Dans les deux cas, si je dois vous retomber dessus, ça fera plutot mal.

                                            PS :

                                            Citation : Ratarddaboss

                                            Je pense que tu devrais te remettre en question avant de critiquer nos avis professionels sur ta question.


                                            Professionnel ? Qu'est-ce que t'entend par là ? C'est le premier message que t'écrivais, on est pas censé te connaitre.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              25 mars 2008 à 18:16:58

                                              OK on repart à zéro (ben oui, c'est concept)

                                              Alors, si ton prof t'a enseigné a faire des classes comme ça t'es mal barré mais au moins tu n'as qu'à lui donner ce qu'il souhaite et après tu peux apprendre comme il faut par toi même dans des livres bien cotés ou sur des forums en excluants les messages de bêtises. (bêêêêê!)

                                              Donc l'utilisation du this est très rare en C++. Surtout lors de l'affectation des membres. À l'exception des méthodes statiques, il est pris pour acquis que les méthodes agissent directement sur une instance (un objet). donc pour construire mon objet je n'ai pas besoin d'un temporaire, pas plus de this.

                                              Un exemple le plus simple possible :
                                              1. #include <iostream>
                                              2. class MaClasse
                                              3. {
                                              4.     int i_;
                                              5. public:
                                              6.     MaClasse()
                                              7.     {
                                              8.         i_ = 0;
                                              9.     }
                                              10.     // OU en utilisant la liste d'initialisation (forme à prioriser)
                                              11.     MaClasse() : i_( 0 ) {}
                                              12.     void setI( int i )
                                              13.     {
                                              14.         i_ = i;
                                              15.     }
                                              16.     int getI()
                                              17.     {
                                              18.         return i_;
                                              19.     }
                                              20. };
                                              21. int main()
                                              22. {
                                              23.     MaClasse obj;
                                              24.     std::cout << "Avant setI() : " << obj.getI() << std::endl;
                                              25.     obj.setI( 10 );
                                              26.     std::cout << "Apres setI() : " << obj.getI() << std::endl;
                                              27.     return 0;
                                              28. }

                                              (pour les avancés : c'est "int getI() const")

                                              Bon j'ai tout mis dans un fichier, mais la forme que je préfère c'est de déclarer (signature) ma classe dans un fichier .h et de définir mes méthodes dans un fichier .cpp associé.

                                              Comme tu peux le voir, je n'utilise pas de pointeurs, ils sont inutiles. ici.

                                              Pour facilité ta compréhension, je t'invite à aller voir les chapitres sur les classes dans le tuto officiel de C++ sur le site.

                                              Maintenant, pour toi, il faut revoir l'idée de ta classe : sont but. Est-ce vraiment un tableau que tu dois emballer (wrapper) dans une classe. Ici tu implémentes un Tableau sous forme de liste.

                                              Est-ce une demande de ton prof? Si oui je te conseil d'abords de faire 2 classes : une struct Element qui contient saValeur et Element * pt_suivant.

                                              Une classe ListeEntiers (ou TableauEntiers) qui contient un pointeur sur le premier élément (la tête) et falcultativement un pointeur sur le dernier. Pour faciliter la tâche de lecture et d'écriture tu peux aussi conserver un compteur d'éléments.

                                              Ainsi tu ne te mélangeras pas entre les pointeur de classe, this et les pointeurs d'éléments...

                                              Une information sur l'indice n'est pas nécessaire si l'indice est toujours contigüe. Premièrement ça va te sauver du travail lors de la destruction et lorsque tu veux lire le n-ieme élément tu n'as qu'à partir de la tête et "compter" les suivants jusqu'à ce que tu arrives à ta réponse.

                                              Bon je ne ferai pas tout ton code, je crois que l'idée est déjà largement élaborée.

                                              Si au contraire le but est d'emballer un tableau : tu t'y prends mal... tu devrais déclarer un pointeur sur un int et allouer un tableau dynamique dans ta classe. Tu devras gérer les cas d'agrandissement et de désallocation du tableau. Tout simplement.

                                              P.S. Suck my void et Ratarddaboss vous êtes inutiles. Ouf! j'ai risqué de l'écrire en GROS et gras, c'est tellement plus punché!
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                25 mars 2008 à 18:33:23

                                                Citation : MatteX

                                                (pour les avancés : c'est "int getI() const")


                                                Mouais. Je pense que c'est un tort de penser que c'est "avancé". Avec de tels arguments, c'est le coup à avoir des "ouais, les consts c'est <<avancé>>, moi je ne le suis pas, et puis c'est long à taper, donc je n'en mets pas". Seul problème, les const sont hyper intrusifs et dès que l'on commence à en utiliser (typiquement un constructeur de copie), on est obligé d'en mettre partout.
                                                Autant prendre les bonnes habitudes dès le départ, plutôt que de perdre plus de temps après.

                                                Un vrai truc avancé :p , c'est que parfois le "this->" est nécessaire (dans le cas des templates)

                                                Sinon, bonne initiative.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                                                  25 mars 2008 à 18:44:16

                                                  Citation : lmghs

                                                  Citation : MatteX

                                                  (pour les avancés : c'est "int getI() const")


                                                  Mouais. Je pense que c'est un tort de penser que c'est "avancé". Avec de tels arguments, c'est le coup à avoir des "ouais, les consts c'est <<avancé>>, moi je ne le suis pas, et puis c'est long à taper, donc je n'en mets pas". Seul problème, les const sont hyper intrusifs et dès que l'on commence à en utiliser (typiquement un constructeur de copie), on est obligé d'en mettre partout.
                                                  Autant prendre les bonnes habitudes dès le départ, plutôt que de perdre plus de temps après.

                                                  Un vrai truc avancé :p , c'est que parfois le "this->" est nécessaire (dans le cas des templates)

                                                  Sinon, bonne initiative.



                                                  Dac, le terme "avancé" était vraiment mal choisi parce qu'il est vrai qu'il devrait être mis en pratique dès le départ... mais j'ai tendance à suivre l'évolution du cours de M@teo21 et à ce que j'ai vu dans son nouveau TP, il ne les utilises pas. De toute façon, la forme Accesseurs/Manipulateurs n'est pas à recommandée non plus. C'est un exemple qui ce voulait simple.

                                                  this est parfois nécessaire mais ce n'est pas toujours courant. Dans le cas d'une classe comme celle que j'ai vu au début de la discussion, les pointeurs sur la même classe et le this sont un tas d'embrouilles inutiles.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    25 mars 2008 à 19:09:48

                                                    Pour le const, c'est un regret que j'avais déjà dû exprimer.

                                                    Pour le this, entièrement d'accord.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                                                      25 mars 2008 à 21:59:10

                                                      Bonsoir,

                                                      Merci pour toutes ces réponses encourageantes, je vais relire le tuto officiel, et je prendrais en compte vos commentaires :).
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      Classe Tableau : le programme arrête de fonctionner

                                                      × 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