Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] ZeroClassGenerator

Erreur de segmentation

Sujet résolu
    9 juin 2008 à 18:47:03

    Bonjour,


    J'ai tenté de créer le ZeroClassGenerator, mais il y a une erreur de segmentation lors de l'exécution du slot.
    J'ai comparé avec le slot créé par M@téo, mais je ne vois rien de flagrant.

    Je vous poste le code du slot ; apparemment, ça ne vient pas de la création de la seconde fenêtre, puisque même quand je mets en commentaires la création de la fenêtre, il y a l'erreur.

    Merci par avance.

    void MainWin::makeCode()
    {
        if (nameClass->text().isEmpty())
        {
            QMessageBox::warning(this, "Erreur", "Veuillez entrer au moins un nom de classe.");
            return;
        }
    
        QString codeH;
        codeH = "";
        QString codeCpp;
        codeCpp = "";
    
        if (thirdPart->isChecked() == true)
        {
            codeH += "*/\nAuteur : " + author->text() + "\n";
            codeH += "Créée le : " + date->date().toString() + "\n\n";
            if (comments->toPlainText() != "")
                codeH += "Rôle de la classe :\n" + comments->toPlainText() + "\n";
            codeH += "*/\n\n";
    
            codeCpp = codeH;
        }
        if (protectIncludes->isChecked())
        {
            codeH += "#ifndef " + nameClass->text().toUpper() + "_H\n";
            codeH += "#define " + nameClass->text().toUpper() + "_H\n\n\n";
    
            codeCpp += "#ifndef " + nameClass->text().toUpper() + "_CPP\n";
            codeCpp += "#define " + nameClass->text().toUpper() + "_CPP\n\n\n";
        }
    
        codeH += "class " + nameClass->text();
    
        if (mumClass->text() != "")
            codeH += " : public " + mumClass->text();
    
        codeH += "{\n   public : \n";
    
        if (construct->isChecked())
        {
            codeH += "      " + nameClass->text() + "();\n";
            codeCpp += nameClass->text() + "::" + nameClass->text() + "()\n{\n  \n}\n";
        }
        if (destruct->isChecked())
        {
            codeH += "      ~" + nameClass->text() +"();\n";
            codeCpp += nameClass->text() + "::~" + nameClass->text() + "()\n{\n \n}\n";
        }
    
        codeH += "\n    protected :\n\n private :\n\n};\n";
    
        if (protectIncludes->isChecked())
        {
            codeH += "#endif\n";
            codeCpp += "#endif\n";
        }
    
        CodeWin *daughterWin = new CodeWin(codeH, codeCpp, nameClass->text(), this);
        daughterWin->exec();
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      9 juin 2008 à 18:52:53

      C'est quoi le constructeur de ta fenetre secondaire ? (la classe qui la supporte en fait) parce que t'envoie 2 QString en paramètre.
      Sinon il y a :
      if (thirdPart->isChecked() == true)
      
      t'es sur de ça ? C'est peut-être rien mais vérifie
      • Partager sur Facebook
      • Partager sur Twitter
        9 juin 2008 à 19:02:59

        La classe dont hérite le seconde fenêtre est QDialog.

        Le constructeur, c'est moi qui l'ai créé donc les deux QString normalement c'est OK. (En fait, ça affiche les deux fenêtres, une dans chaque onglet.)

        Pour thirdpart :
        QGroupBox *thirdPart = new QGroupBox("Ajouter des commentaires", this);
                thirdPart->setCheckable(true);
                thirdPart->setChecked(false);
        

        donc normalement, c'est OK aussi.
        • Partager sur Facebook
        • Partager sur Twitter
          10 juin 2008 à 20:43:51

          Pas de solution à mon problème ? :'(
          • Partager sur Facebook
          • Partager sur Twitter
            11 juin 2008 à 12:11:52

            Citation : darkangel75

            C'est quoi le constructeur de ta fenetre secondaire ? (la classe qui la supporte en fait) parce que t'envoie 2 QString en paramètre.
            Sinon il y a :

            if (thirdPart->isChecked() == true)
            

            t'es sur de ça ? C'est peut-être rien mais vérifie



            C'est pas
            if (thirdPart->isChecked() == true)
            
            ; enlève le == true
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              11 juin 2008 à 12:33:05

              que donne gdb ?
              • Partager sur Facebook
              • Partager sur Twitter
                11 juin 2008 à 14:06:59

                Pareil en enlevant " == true".

                C'est quoi le gdb ? :-°
                • Partager sur Facebook
                • Partager sur Twitter
                  11 juin 2008 à 15:18:38

                  Selon GDB, le problème vient de cette ligne :
                  if (thirdPart->isChecked())
                  


                  Je l'ai passée en commentaire, ai recompilé le projet, et le programme fonctionne normalement.

                  Je ne comprends pas ce qu'il se passe. o_O

                  Citation : GDB

                  [Thread debugging using libthread_db enabled]
                  [New Thread 0xb7053720 (LWP 11990)]
                  Qt: gdb: -nograb added to command-line options.
                  Use the -dograb option to enforce grabbing.

                  Program received signal SIGSEGV, Segmentation fault.
                  [Switching to Thread 0xb7053720 (LWP 11990)]
                  0xb7c7534b in QGroupBox::isChecked () from /usr/lib/libQtGui.so.4

                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 juin 2008 à 15:26:23

                    Quand tu fais
                    QGroupBox *thirdPart= new QGroupBox("Ajouter des commentaires", this);

                    tu définie un nouveau pointeur qui as le même nom que le pointeur que tu pensais utiliser.
                    Tu initialise donc le nouveau pointeur et non celui que tu pensais.
                    if (thirdPart->isChecked())

                    thirdPart n'est pas initialisé => seg fault

                    il te suffit donc de modifier ton code par

                    thirdPart = new QGroupBox("Ajouter des commentaires", this);

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      11 juin 2008 à 20:22:44

                      Rappel: une erreur de segmentation et une erreur mémoire souvent du au fait de la lecture/écriture sur de adresse non autorisés
                      @+
                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 juin 2008 à 22:47:49

                        Bonjour,

                        Je débute en C et C++ mais j'ai déjà eu cette erreur, après long recherche, j'ai rien trouvé et j'ai tenté le tout pour le tout:

                        qmake -project
                        qmake
                        make

                        Et ça a marché, c'était peut être de la chance mais tu peut toujours essayer. Pour moi ça a marché.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 juin 2008 à 10:31:57

                          Une question bête : pourquoi il n'y a pas de seg fault avec les autres pointeurs que j'utilise (les QLineEdit, les QCheckBox, ...) ?
                          Je les initialise pareil, sont membres de la même classe, ...



                          • Partager sur Facebook
                          • Partager sur Twitter
                            12 juin 2008 à 11:41:30

                            Bonjour !

                            En fait, la seg fault vient du fait que tu aie re-déclarer le pointeur thridPart : une fois dans le .h de ta classe (QGroupBox *thirdPart;) , puis une autre fois dans le constructeur (QGroupBox *thirdPart = new.....;)

                            Pour répondre à ta question, tes autres pointeurs ne sont pas (normalement :lol: ) ré-initialisés lorsque te les crées donc tu n'a pas d'autres seg fault

                            @+
                            • Partager sur Facebook
                            • Partager sur Twitter
                              12 juin 2008 à 11:54:05

                              Ça y est, j'ai compris et tout fonctionne.

                              Merci beaucoup à vous tous. :)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                14 juin 2008 à 9:48:21

                                D'ailleurs on n'utilise pas les protections contre les inclusions multiples que dans les headers et non dans les .Cpp
                                • Partager sur Facebook
                                • Partager sur Twitter

                                [Qt] ZeroClassGenerator

                                × 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