Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec les pointeurs

dans une méthode

Sujet résolu
    26 avril 2008 à 13:42:44

    Bonjour tout le monde ! :)

    Je suis en train de réaliser une GUI avec Qt dans laquelle j'ai une barre de menus avec plein de menus et plein d'action, avec des icones et des raccourcis clavier ! :p

    Pour l'instant j'ai un code de ce genre (mais avec plein d'actions, donc le fichier est assez conséquent :-° ) :
    #include <QtGUI>
    
    class Programme : public QWidget
    {
        public :
            Programme (void);
            
        private :
            QMenuBar *barre;
            QMenu    *menu;
            QAction  *action;
    };
    
    Programme::Programme (void)
    {
        barre = new QMenuBar (this);
        menu = new QMenu (tr ("Menu"), this);
        
        action = new QAction (tr ("Action"), this);
        action -> setIcon (QIcon ("Icones\\icone.png"));
        action -> setShortcut (Qt::CTRL + Qt::Key_A);
        
        menu -> addAction (action);
        barre -> addMenu (menu);
    }
    
    int main (int argc, char *argv[])
    {
        QApplication app (argc, argv);
    
        Programme programme;
        programme.show ();
        
        return app.exec();
    }
    

    Donc pour allèger un peu mon code, j'ai voulu faire une fonction qui initialise une QAction en prenant en paramètre un pointeur vers une QAction, le nom qu'il faut lui donner, son raccourci clavier et l'emplacement de son icone ^^ :
    #include <QtGUI>
    
    class Programme : public QWidget
    {
        public :
            Programme (void);
            void InitAction (QAction *action, const char* texte, 
                             QString chemin, QKeySequence racourci);
            
        private :
            QMenuBar *barre;
            QMenu    *menu;
            QAction  *action;
    };
    
    Programme::Programme (void)
    {
        barre = new QMenuBar (this);
        menu = new QMenu (tr ("Menu"), this);
        
        InitAction (action, "Action", "Icones\\icones.png", Qt::CTRL + Qt::Key_A);
        
        menu -> addAction (action);
        barre -> addMenu (menu);
    }
    
    void Programme::InitAction (QAction *action, const char* texte, 
                                QString chemin, QKeySequence racourci)
    {
        action = new QAction (tr (texte), this);
        action -> setIcon (QIcon (chemin));
        action -> setShortcut (racourci);
    }
    
    int main (int argc, char *argv[])
    {
        QApplication app (argc, argv);
    
        Programme programme;
        programme.show ();
        
        return app.exec();
    }
    

    Mais malheureusement, elle ne marche pas ! :( Il doit y avoir un problème avec les pointeurs, mais je ne vois pas où. Donc merci de m'aider ! :D

    Merci d'avance ! ;)
    • Partager sur Facebook
    • Partager sur Twitter
      26 avril 2008 à 14:30:11

      c'estquoi l'erreur justement?
      • Partager sur Facebook
      • Partager sur Twitter
        26 avril 2008 à 15:59:48

        Ben il n'y a pas d'erreurs lors de la compilation. C'est lorsque j'execute le programme que j'ai le message d'erreur suivant (et en plus je ne code pas sous Visual Studio o_O ) :

        Image utilisateur

        Par contre lors du deboggage, Dev-cpp me dit qu'il y a une erreur de segmentation dans mon programme :(

        Quelqu'un voit d'où vient le problème ? :euh:
        • Partager sur Facebook
        • Partager sur Twitter
          27 avril 2008 à 16:16:54

          UP

          Je n'arrive toujours pas à trouver d'où vient l'erreur ... :(
          • Partager sur Facebook
          • Partager sur Twitter
            27 avril 2008 à 16:21:28

            Soit tu débogues en mode pas-à-pas. Soit tu mets des cout à toutes les lignes et tu regardes quel est le derner message qui s'affiche. L'erreur est forcément à la ligne suivante.
            • Partager sur Facebook
            • Partager sur Twitter
            Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
              5 mai 2008 à 17:45:06

              UP !!! ^^

              Le déboggage trouve une erreur de segmentation et les tests avec les cout, les #if 0 ... donne que c'est l'allocation dynamique de l'action qui pose probème ! Mais je ne vois toujours pas pourquoi ... :(

              Merci d'avance, j'ai vraiment besoin de cette fonction ! :D
              • Partager sur Facebook
              • Partager sur Twitter
                5 mai 2008 à 18:07:12

                Si tu débogues en pas-à-pas tu sais exactement à quelle ligne à lieu l'erreur d'exécution, donc tu sais comment résoudre ton problème.
                • Partager sur Facebook
                • Partager sur Twitter
                Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                  5 mai 2008 à 18:26:37

                  Le débogueur JIT c'est avec du C++/CLI (.NET).

                  Je ne crois pas que ce soit compatible avec Qt. Tu as probablement mal sélectionné ton type de projet. Ce qu'il te faut c'est une application Win32 native.

                  Notez que je suis inexpérimenté avec Qt et C++/CLI mais je connais Visual Studio. Je peux vraiment me tromper sur ce que j'avance mais ça me semble logique.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 mai 2008 à 18:36:10

                    Et je fais comment pour débogger pas à pas ? Le menu qui le permet est grisé (donc on peut pas cliquer dessus) et lorsque je fais un déboggage normal, cela me dit que je n'ai aucune infos de déboggage ! o_O

                    MatteX -> mon projet est bien sélectionné, je n'ai pas besoin d'application Win32 native. Je précise que je suis sous dev-c++ et que je n'utilise pas C++/CLI (s'il faut utiliser .NET, C# est beaucoup mieux ... :p ).
                    Par ailleurs, je compile mon projet comme ici et cela a toujours marché parfaitement ! ;)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 mai 2008 à 18:40:48

                      Pour le mode pas-à-pas, il faut compiler avec l'option '-g' (pour gcc).

                      La macro Q_OBJECT en haut de ta classe n'aiderait pas, du fait que ta classe hérite de QWidget ? (Fait longtemps que je n'ai rien fait avec Qt, mais j'avais pris l'habitude de mettre cette macro dans toutes mes classes)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 mai 2008 à 18:45:48

                        bizarre alors l'erreur du JIT... néanmoins il parle d'une exception non-attrapée. alors englobes ta zone d'erreur comme ceci:

                        try
                        {
                            // code pouvant lever l'exception
                        }
                        catch( const std::exception & ex )
                        {
                           // Affiche l'exception
                           // Comme tu n'as pas de console en Qt, je te conseille de l'écrire vers un fichier.
                        
                           std::ofstream ofs( "c:\erreur.log" ); // facile à retrouver
                           if( ofs )
                               ofs << ex.what() << std::endl;
                        }
                        


                        Sinon tu peux te mettre un point d'arrêt (Break Point) à l'intérieur du bloc catch et voir le message d'erreur au moment de l'exécution.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 mai 2008 à 19:21:31

                          Ben aucune exeption n'est levée dans le code qui fait beugger.
                          Et cela ne marche pas non plus avec la macro Q_OBJECT. :(

                          Est-ce que cela marche chez vous ? o_O
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            5 mai 2008 à 19:37:34

                            Salut,

                            je suis pas un expert en C++, mais ce ne serait pas plus simple comme ceci :

                            class Programme : public QWidget
                            {
                                public :
                                    Programme (void);
                                    void InitAction (QAction *action, const char* texte, 
                                                     QString chemin, QKeySequence racourci);
                                    
                                private :
                                    QMenuBar *barre;
                                    QMenu    *menu;
                                    QAction  *action;
                            };
                            
                            //..
                            void Programme::InitAction (Qconst char* texte, QString chemin, QKeySequence racourci)
                            {
                                action = new QAction (tr (texte), this);
                                action -> setIcon (QIcon (chemin));
                                action -> setShortcut (racourci);
                            }
                            
                            //..
                            


                            Pourquoi passer un action comme argument alors que c'est un champ de ta classe ?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              5 mai 2008 à 20:00:59

                              Parce que la fonction sera appelée pour plusieurs actions ! J'ai une bonne vingtaine d'actions à initialiser avec un texte, un icone et un raccourci clavier. Cela prend donc 3 lignes à chaque initialisation, ce qui fait un fichier énorme. :-°
                              Avec cette fonction, j'aimerais donc pouvoir ramener à une seule ligne l'initialisation. Mais pour ce faire, je suis bien obligé de dire quel pointeur d'action je veux initialiser ! ^^

                              Mais ton code me donne une idée ... :D

                              Si je passe à la fonction les mêmes arguments que SirJulio, que je créer une QAction avec et que je retourne cette QAction, je pourrai initialiser ma vrai QAction par copie non ? o_O

                              Un peu comme cela :
                              #include <iostream>
                              
                              using namespace std;
                              
                              char* fonction (int nombre)
                              {
                                  char chaine [100] = {0};
                                  sprintf (chaine, "%d\0", nombre);
                                  return chaine;
                              }
                              
                              
                              int main (int argc, char *argv[])
                              {
                                  char *chaine = fonction (123);
                                  cout << chaine;
                                  
                                  system ("PAUSE");
                                  return 0;
                              }
                              

                              Mais avec des QAction ... :D
                              • Partager sur Facebook
                              • Partager sur Twitter
                                5 mai 2008 à 20:09:32

                                ok je viens de relire ton code et il y a 2 choses amusantes

                                1) Tu as une variable membre nommée action et une méthode prenant en paramètre un pointeur nommé action. Lequel sera utilisé à l'intérieur de la méthode? Ce devrait être le paramètre mais tout dépend de ton compilateur en fait.

                                2) Tu passes un pointeur par copie que tu manipule à l'intérieur de ta fonction. À la sortie le pointeur passé sera encore non-initialisé puisque tu l'as passé par copie (avec une valeure bizarre en plus parce que tu ne l'as pas initialisé).

                                Je crois que le cas amusant #2 est le problème qui cause le segfault
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  5 mai 2008 à 20:12:49

                                  Alors dans ce cas, passe ton pointeur par ref, du genre :

                                  class Programme : public QWidget
                                  {
                                      public :
                                          Programme (void);
                                          void InitAction (QAction*& action, const char* texte, 
                                                           QString chemin, QKeySequence racourci);
                                          
                                      private :
                                          QMenuBar *barre;
                                          QMenu    *menu;
                                          QAction  *action;
                                  };
                                  
                                  //..
                                  void Programme::InitAction (Qaction*& action, Qconst char* texte, QString chemin, QKeySequence racourci)
                                  {
                                      action = new QAction (tr (texte), this);
                                      action -> setIcon (QIcon (chemin));
                                      action -> setShortcut (racourci);
                                  }
                                  


                                  La, ton pointer devrait bien etre initialisé en sortie d'InitAction.

                                  edit : Mattex a deja repondu, donc je plussoie ce qui est dit au dessus.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    5 mai 2008 à 20:15:58

                                    ou ne passe pas dutout ton pointeur en paramètre puisqu'il est membre de ta classe
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      5 mai 2008 à 20:37:17

                                      OK merci beaucoup à SirJulio et à tous les autres ! ;)

                                      La fonction marche cette fois (celle avec les réfèrences ^^ ) !
                                      Je suis trop content, tournée générale ! :lol: lol :p

                                      Encore merci beaucoup à tout le monde, la prochaine fois je penserai aux réfèrences ! :lol:
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Problème avec les pointeurs

                                      × 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