Partage
  • Partager sur Facebook
  • Partager sur Twitter

std::vector `tableau' undeclared

Comment le déclarer ?

Sujet résolu
    5 août 2008 à 15:16:47

    Citation : Hiura

    Oui c'est ça. Il faut trouver autre chose. Tu disais tout à l'heure que c'était pour l'affichage, c'est bien ça? Alors pourquoi pas un QWigdet? (Je ne peux rien affirmer, je ne connais de loin pas assez Qt.)


    On peut pas écrire dans le Qwidget. Enfin je crois pas... A l'avenir je voudrais virer cet héritage débile et faire ca bien mais pour l'instant je ne sais pas comment faire autrement.
    • Partager sur Facebook
    • Partager sur Twitter
      5 août 2008 à 15:49:52

      La question est... que va faire ton programme ?

      Comment penses-tu utiliser tes cellules ?
      • Partager sur Facebook
      • Partager sur Twitter
        5 août 2008 à 17:49:17

        Citation : MatteX

        La question est... que va faire ton programme ?

        Comment penses-tu utiliser tes cellules ?


        Rien de bien méchant. Juste faire vivre une population de cellule dans un milieu. Au début je simplifie a l'extrême et même au delà parce que c'est déjà assez compliqué comme ca ensuite je verais comment complexifié la chose. C'est juste pour le fun.
        • Partager sur Facebook
        • Partager sur Twitter
          5 août 2008 à 17:54:27

          Alors l'héritage de QLabel n'est vraiment pas ce qu'il te faut.

          Utilise un QGridLayout pour afficher une grille que tu remplira de QLabel. Tu peux de faire un vector de pointeurs vers ses QLabels si tu le souhaite.
          • Partager sur Facebook
          • Partager sur Twitter
            5 août 2008 à 18:03:06

            Ok et en faite dans mes Qlabel je ferai un truc du genre :

            setText("la cellule a " + QString::number(tableauCellule[i].getEnergie() + " d'énergie")
            

            C'est ca ?
            Je sais pas trop comment je vais m'y prendre mais bon c'est pas mal comme idée.
            • Partager sur Facebook
            • Partager sur Twitter
              5 août 2008 à 19:57:13

              Citation : Hiura

              Pour la copie depuis la console c'est compliqué, je te l'accorde : clic droit, sélection, déplace le curseur (flèche) pour trouver le début de la sélection, puis tu déplace avec <maj> enfoncé, puis <enter>.



              Ca peut être très simple en mode d'édition rapide !

              A) Activation du mode édition rapide :
              1) Clique droit sur la barre de titre de la console
              2) Propriétés
              3) Dans l'onglet "Option" et dans le groupebox "Options d'édition", cocher la case "Mode d'édition rapide".
              4) Cliquer sur OK : une fenêtre s'ouvre. Choisir "d'enregistrer les propriétés pour les fenêtres futures ayant le même titre".
              5) Cliquer sur OK

              B) Maintenant pour toutes les consoles ayant le même titre, afin de c/c, il faudra :
              1) Sélectionner à la souris la zone de texte à copier (de la même façon que dans un éditeur de texte).
              2) Pour copier, faire un clique droit sur le texte sélectionné.
              3) Pour coller dans la console le contenu du presse papier, c'est aussi le clique droit.
              4) De retour dans votre application graphique (firefox) pour coller le contenu du presse-papier c'est toujours 'Ctrl+V' ...

              Et voilà ! C'est pas beautiful ça hein ?

              PS1 : L'opération 'A)' est à refaire à chaque fois qu'une console porte un nom différent de ceux pour lesquels le mode d'édition rapide a été activé.. :)
              PS2 : Oubliez les captures d'écran ;)
              • Partager sur Facebook
              • Partager sur Twitter
              Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
                5 août 2008 à 23:36:01

                Bon si je fais hérité ma Cellule de QObject j'ai le même problème. Du coup je peux pas mettre de Cellule dans un tableau car je suis obligé de faire hérité ma cellule au moins pour les slot.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  5 août 2008 à 23:58:52

                  Citation : iNaKoll

                  <snip>
                  Et voilà ! C'est pas beautiful ça hein ?

                  Non. Parce que pour le trouver............. :-° Mais merci du tuyau! ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 août 2008 à 0:02:20

                    Bon j'ai viré l'héritage comme ca du coup mon tableau de cellule marche nikel ;)
                    Par contre je peux pas faire de tableau de QLabel donc je dans la merde.

                    Edit : J'ai palier au probleme en faisant un Qlabel label[50]; mais je sais que c'est très très pas bien... si vous avez mieux a proposer.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      6 août 2008 à 0:41:54

                      En gros, tu as "simplement" du texte à afficher?
                      Alors soit tu fais un std::vector<Cellule*>, avec l'héritage, soit tu ne fais pas d'héritage mais tu mets un attribut QLabel dans la classe Cellule.
                      (Edit : pour le vector c'est à coup de push_back(new Cellule(...)) que tu le remplis.)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 août 2008 à 8:46:27

                        Citation : Hiura

                        En gros, tu as "simplement" du texte à afficher?
                        Alors soit tu fais un std::vector<Cellule*>, avec l'héritage, soit tu ne fais pas d'héritage mais tu mets un attribut QLabel dans la classe Cellule.


                        Non j'ai viré l'héritage puisque ça empêchait de faire un tableau de Cellule. La classe cellule n'hérite pas. Par contre j'ai fais ca :

                        for(unsigned int i(0); i < tableauCellule.size() ; i++)
                        {
                           label[i+i].setText(QString::number(tableauCellule[i].getAge()));
                           label[i+i+1].setText(QString::number(tableauCellule[i].getEnergie()));
                        }
                        

                        Ca marche très bien sauf que j'ai fais un QLabel label[50] pour avoir de la marge car je ne me sens pas capable de faire ceci :

                        Citation : Nanoc

                        Cependant, si l'on veut créer des tableaux dont la taille varie au cours du programme ou si la taille d'un tableau n'est pas connue lors de la compilation, des problèmes apparaissent. Pour créer des tableaux dont la taille varie, il faut allouer soi-même la mémoire via l'opérateur new et redimensionner "à la main" le tableau à chaque fois que l'on ajoute un élément ou qu'on en supprime. C'est donc très peu pratique et l'on fait souvent des erreurs.


                        C'est très sale mais si tu m'explique comment faire mieux je suis preneur.
                        Pour ce qui est de mettre des attribut QLabel dans la cellule je sais pas ce que ca donnerais. Ca supprimerais le probleme du tableau pas dynamique immonde pas propre certe mais apres ? Je pourrais faire :

                        for(unsigned int i(0); i < tableauCellule.size() ; i++) //On parcourt le tableau
                        {
                            layout->addWidget(&tableauCellule[i].getLabel1(), i, 1);
                            layout->addWidget(&tableauCellule[i].getLabel2(), i, 2);
                            layout->addWidget(&tableauCellule[i].getLabel3(), i, 3);
                        }
                        

                        Mais ca m'oblige a avoir pas mal de label dans chaque cellule c'est pas forcement le mieux. Je sais pas qu'en pense tu.

                        Citation : Hiura

                        (Edit : pour le vector c'est à coup de push_back(new Cellule(...)) que tu le remplis.)


                        Merci je voulais justement demander ^^

                        ps : pour le numero des lignes c'était juste une option pas coché dans mes options.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 août 2008 à 9:01:46

                          Si tu as enlevé l'héritage, alors tu peux utiliser un std::vector.. ce sera mieux que l'ignoble new pour le tableau dynamique "à la C".
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                            6 août 2008 à 9:05:58

                            Je peux pour les cellules oui. C'est ce que j'ai fais.
                            Par contre je voudrais avoir un tableau dynamique de QLabel pour pouvoir afficher les attributs de chaque cellule et ca je ne peux pas car on l'a vu hier les Qlabel passent pas dans les std::vector.

                            Du coup un Qlabel label[50] très ignoble.

                            edit : j'ai fais ca :

                            tableauCellule.push_back(new Cellule());
                            

                            mais ca compile pas.

                            FenPrincipale.cpp:91: error: no matching function for call to `std::vector<Cellu
                            le, std::allocator<Cellule> >::push_back(Cellule*)'
                            C:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/stl_vec
                            tor.h:557: note: candidates are: void std::vector<_Tp, _Alloc>::push_back(const
                            _Tp&) [with _Tp = Cellule, _Alloc = std::allocator<Cellule>]
                            mingw32-make[1]: *** [release/FenPrincipale.o] Error 1
                            • Partager sur Facebook
                            • Partager sur Twitter
                              6 août 2008 à 9:34:35

                              Tu peux pas mettre un Cellule* dans un tableau de Cellule. Donc soit tu changes le type contenu, soit tu ne remplis pas avec un pointeur.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                6 août 2008 à 9:37:39

                                Mais c'est pas un pointeur. J'ai fais :

                                tableauCellule.push_back(new Cellule());
                                

                                pas
                                tableauCellule.push_back(new *Cellule());
                                
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  6 août 2008 à 9:54:18

                                  Nan, tu dois mettre un pointeur de cellule dans le template du vector :
                                  std::vector<Cellule*>
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    6 août 2008 à 9:57:18

                                    Ha mais ca apporte quoi ?

                                    edit : j'ai essayé mais j'ai du me planter quelque part puisque le programme plante. Une histoire de pointeur qui va pas bien.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      6 août 2008 à 9:58:07

                                      de pouvoir utiliser des objets en principe non-copiable dans un vecteur.




                                      edit : ne pas oublier les delete non automatiques,
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        6 août 2008 à 10:08:16

                                        Citation : Hiura

                                        de pouvoir utiliser des objets en principe non-copiable dans un vecteur.


                                        Ils sont copiable.
                                        Je ne sais pas comment utilisé le pointeur dans le vector puisque ca fait planter...

                                        Citation : Hiura

                                        edit : ne pas oublier les delete non automatiques,


                                        Alors là on retombe sur le même probleme dont je n'ai pas eu de réponse. Comment faire pour que les delete soient fait au moment ou on quitte le programme ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Anonyme
                                          6 août 2008 à 10:18:26

                                          Je crois qu'on s'embrouille. En fait tes cellules ne sont pas liées à l'affichage, c'est ça?
                                          Et tu veux utiliser un tableau (dynamique?) de QLabel pour l'affichage?

                                          Si oui-oui alors tu fais un vector de <Cellule> et un autre de <QLabel*>. (Ou bien?)

                                          Pour l'utilisation de std::vector<T*> tab , c'est tab[i]->f(arg); Comme pour un pointeur de T :
                                          T* ptr = new T(...);
                                          ptr->f(arg);
                                          


                                          Pour désallocation :
                                          void desaloc(std::vector<T*>& tab) { 
                                              for (std::vector<T*>::size_type i = 0; i < tab.size(); ++i)
                                                  delete tab[i];
                                          }
                                          


                                          T représente un type quelconque. Remplace le par QLabel.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            6 août 2008 à 10:24:13

                                            Citation : Hiura

                                            Je crois qu'on s'embrouille. En fait tes cellules ne sont pas liées à l'affichage, c'est ça?


                                            Elles ne le sont plus. C'était la merde. Du coup coup ce sont des objet normaux qui n'hérite de rien. Ensuite dans des Qlabel je fait label[i].setText(QString::number(tableauCellule[i].getEnergie()));

                                            Citation : Hiura

                                            Et tu veux utiliser un tableau (dynamique?) de QLabel pour l'affichage?


                                            Voila c'est ca.

                                            Citation : Hiura

                                            Si oui-oui alors tu fais un vector de <Cellule> et un autre de <QLabel*>.


                                            Ca doit pas être mal comme ca oui.

                                            Pour la desallocation le problème est d'appeler la fonction au moment du clique sur la croix rouge par exemple...

                                            édit : voila maintenant que j'ai des pointeur c'est l'embrouille : le programme a cessé de fonctionner, windows cherche une solution au problème.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              6 août 2008 à 10:32:59

                                              Citation : Aravis

                                              Citation : Hiura

                                              edit : ne pas oublier les delete non automatiques,


                                              Alors là on retombe sur le même probleme dont je n'ai pas eu de réponse. Comment faire pour que les delete soient fait au moment ou on quitte le programme ?


                                              Dans le destructeur non ?
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                6 août 2008 à 10:36:48

                                                Mais dans le destructeur de quoi ? De la fenêtre principale ? Y'en a pas puisque Qt gère ca tout seul.
                                                On peut peu être le rajouter mais va t'il être appelé ? Je sais pas moi.

                                                private:
                                                std::vector<Cellule> tableauCellule;
                                                std::vector<QLabel*> tableauLabel;
                                                


                                                FenPrincipale::FenPrincipale() : tableauCellule(4), tableauLabel(8)
                                                {
                                                


                                                for(unsigned int i(0); i < tableauCellule.size() ; i++)
                                                {
                                                   tableauLabel[i+i]->setText(QString::number(tableauCellule[i].getAge()));
                                                   tableauLabel[i+i+1]->setText(QString::number(tableauCellule[i].getEnergie()));
                                                }
                                                

                                                C'est a peut prêt ca l'idée. Mais ca marche pas.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Anonyme
                                                  6 août 2008 à 10:51:29

                                                  Ton tableau de label est mal initialisé : tu lui donne à manger 8 pointeurs invalide. Faut utiliser le deuxième paramètre du constructeur de std::vector.

                                                  Tu as bien soulevé une inconnue avec le destructeur de la fenêtre... Essaye d'afficher qqch dans un fichier lors du destructeur pour voir si il est appelé.

                                                  Sinon il reste une solution, heureusement. Récupérer l'event de fermeture, d'appeler ta fonction de desaloc et d'accepter l'event (cf la doc). Mais c'est pas simple.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    6 août 2008 à 10:59:59

                                                    Citation : Hiura

                                                    Ton tableau de label est mal initialisé : tu lui donne à manger 8 pointeurs invalide. Faut utiliser le deuxième paramètre du constructeur de std::vector.


                                                    C'est quoi le 2ème paramètre ? J'ai pas vu passer de chose comme ca dans le tuto de nanoc.

                                                    Citation : Hiura

                                                    Tu as bien soulevé une inconnue avec le destructeur de la fenêtre... Essaye d'afficher qqch dans un fichier lors du destructeur pour voir si il est appelé.


                                                    C'est une idée... A essayer... mais pour l'instant je peux pas le programme plante :)

                                                    Citation : Hiura

                                                    Sinon il reste une solution, heureusement. Récupérer l'event de fermeture, d'appeler ta fonction de desaloc et d'accepter l'event (cf la doc). Mais c'est pas simple.


                                                    Image utilisateur Je suis sur que c'est possible autrement. Enfin j'espere parce que j'ai pas tout compris.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Anonyme
                                                      6 août 2008 à 11:13:20

                                                      http://www.dinkumware.com/manuals/?man [...] ector::vector 4e constructeur.
                                                      Tu donnes d'abord le nombre (n) d'élément, puis un objet qui sera copié n fois.

                                                      Après, j'ai un doute : est-ce que tous les éléments seront le même pointeur...

                                                      A ce moment là il faut faire une boucle de push_back(new ...);
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        6 août 2008 à 11:25:37

                                                        comme ca ? :

                                                        std::vector<QLabel*> tableauLabel;
                                                        


                                                        FenPrincipale::FenPrincipale() : tableauCellule(4), tableauLabel(8, *QLabel)
                                                        {
                                                        


                                                        Citation

                                                        Après, j'ai un doute : est-ce que tous les éléments seront le même pointeur...


                                                        :euh: c'est pas que je veux être chiant mais ça me ferait une belle jambe dans ce cas.
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          6 août 2008 à 11:35:57

                                                          Et si tu faisait ça:
                                                          std:vector<Cellule*>, comme ça tu n'aurais pas besoin de copier l'objet ( :-° peut être que je m'avance là ^^, mais on n'a bien le droit de faire ça : std::vector<QLabel*> alors je vois ce qui nous empecherait de le faire avec une classe héritée de QLabel.... Je me trompe ?)

                                                          edit: Oups grillé d'une 1h30 :lol: là faut que je retourne me coucher :lol:
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            6 août 2008 à 11:38:14

                                                            @leboy: Oui c'est correct.

                                                            @Aravi: Faudrait que tu relises un peu sur les vector et que tu réflechisses un peu pour que ce que tu écris soit cohérent. Tu peux pas mettre des Truc* dans un tableau de Truc. new renvoit un pointeur.
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                            Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                                              6 août 2008 à 11:49:00

                                                              C'est facile de dire ca quand tu comprend le C comme le francais ^^ .
                                                              Moi je suis franchement complètement embrouillé là. Je comprend ce que je dois faire mais je ne comprend pas comment le réaliser.
                                                              • Est ce que je fais un tableau de pointeur vers cellule avec un boucle de new Cellule
                                                              • ou plutot un tableau de cellule (et je sais pas comment rajouter des truc dedans)
                                                              • Je fais un tableau de pointeur vers Qlabel mais je l'initialise mal
                                                              • etc...

                                                              Ca a pas l'air mais c'est quand même archi compliqué le C++
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              std::vector `tableau' undeclared

                                                              × 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