Partage
  • Partager sur Facebook
  • Partager sur Twitter

erreur de segmentation

c++ qt

Sujet résolu
    31 décembre 2020 à 14:39:35

    bonjour

    j'ai une erreur de segmentation dans une fonction a la déconstruction d'un projet : 

    voidclient::disconnected()
    {
    ui->serverip->setEnabled(true);
    ui->serveurport->setEnabled(true);
    ui->messagelist->append("deconectéeduserveur!");
    ui->messagelist->append("tentativedereconexion...");
    ui->conectbutton->click()
    }

    voila a la ligne 3 il se passe ca

    voila avez vous une solution

    je cherche depuis pas mal de temps 

    merci d'avance

    -
    Edité par unel 31 décembre 2020 à 14:40:32

    • Partager sur Facebook
    • Partager sur Twitter
      31 décembre 2020 à 17:30:29

      Avec le peu d'info que tu donnes, difficile de savoir ou est l'erreur.
      • Partager sur Facebook
      • Partager sur Twitter
        31 décembre 2020 à 17:56:28

        à la ligne 186 de client.cpp ?

        • Partager sur Facebook
        • Partager sur Twitter
          1 janvier 2021 à 12:06:35

          voici mon code :
           #include "client.h"
          #include "ui_client.h"
          
          client::client(QWidget *parent)
              : QMainWindow(parent)
              , ui(new Ui::client)
          {
              ui->setupUi(this); //inisialisationde la fenetre
          
              ui->actionmodifier_le_psedo_d_anonimat->setVisible(false);
              ui->condensedlistmessages->setVisible(false);
              ui->actionfenaitre_condanc_e->setVisible(false);
          
          
              //inisialiation generale du serveur de log
              socket = new QTcpSocket(this);
          
              connect(socket, SIGNAL(readyRead()), this, SLOT(datareceived()));
              connect(socket, SIGNAL(connected()), this, SLOT(connected()));
              connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
              connect(socket, &QTcpSocket::disconnected,this,&client::disconnected);
              connect(socket, &QTcpSocket::errorOccurred, this, &client::socketerror);
          
              //initialisation du serveur de discution
              sockettalk = new QTcpSocket(this);
          
              connect(sockettalk, SIGNAL(readyRead()), this, SLOT(talk_datareceived()));
              connect(sockettalk, SIGNAL(connected()), this, SLOT(talk_conected()));
              connect(sockettalk, SIGNAL(disconnected()), this, SLOT(talk_desconected()));
              connect(sockettalk, &QTcpSocket::disconnected,this,&client::talk_desconected);
              connect(sockettalk, &QTcpSocket::errorOccurred, this, &client::talk_socketerror);
          
          
              messagesize = 0;
          
                  QString serveurid;
                  QFile fichier("conect.temp"); //on ouvre le fichier de preconexion
                  if(fichier.open(QIODevice::ReadOnly | QIODevice::Text))
                  {
                      QString serverinfo;
                      QTextStream flux(&fichier);
                      serveurid = flux.readLine();
                      ui->serverip->setText(serveurid);
                      serveurid = flux.readAll();
                      ui->serveurport->setValue(serveurid.toInt());
                      fichier.close();
                      ui->conectbutton->click();
                  }
                  else
                  {
                      QMessageBox::critical(this, "erreur de lecture de fichier","erreur imposible de lire le fichier de conexion... il faut rentrer les info manullement !");
                  }
                  ui->username->setText(QDir::home().dirName());// on afiche le nom d'utilisateur en psedo par defaut
          }
          //--------------------ui--------------------------------------ui--------------------------------------------------------ui------------------------------------------------------------------------
          void client::on_actionmodifier_le_psedo_d_anonimat_triggered()
          {
              QString anonimoususernaime = QInputDialog::getText(this, "Pseudo", "Quel est votre pseudo ?"); //oui oui le nom d'utilisateur anonime belle oximore non ?
              ui->username->setText(anonimoususernaime);
          }
          
          void client::on_actionvid_e_les_message_triggered()
          {
              ui->messagelist->clear();
          }
          
          void client::on_actionreconexion_2_triggered()
          {
              ui->conectbutton->clicked();
          }
          
          void client::on_actionfenaitre_condanc_e_triggered()
          {
          
              if(ui->actionfenaitre_condanc_e->isChecked()==false)
              {
                  ui->label->setVisible(false);
                  ui->label_2->setVisible(false);
                  ui->label_3->setVisible(false);
                  ui->label_4->setVisible(false);
                  ui->label_5->setVisible(false);
                  ui->conectbutton->setVisible(false);
                  ui->messagelist->setVisible(false);
                  ui->username->setVisible(false);
                  ui->serverip->setVisible(false);
                  ui->serveurport->setVisible(false);
                  ui->condensedlistmessages->setVisible(true);
                  resize(320,100);
              }else{
                  ui->label->setVisible(true);
                  ui->label_2->setVisible(true);
                  ui->label_3->setVisible(true);
                  ui->label_4->setVisible(true);
                  ui->label_5->setVisible(true);
                  ui->conectbutton->setVisible(true);
                  ui->messagelist->setVisible(true);
                  ui->username->setVisible(true);
                  ui->serverip->setVisible(true);
                  ui->serveurport->setVisible(true);
                  ui->condensedlistmessages->setVisible(false);
              }
          
          }
          
          void client::on_actionreconexion_triggered()
          {
              on_conectbutton_clicked();
          }
          
          void client::on_actionpartager_mon_idantit_e_triggered()
          {
              if(ui->actionpartager_mon_idantit_e->isChecked()==false)
              {
                  ui->username->setText("anonimous");
                  ui->username->setEnabled(false);
                  ui->actionmodifier_le_psedo_d_anonimat->setVisible(true);
              }else{
                  ui->username->setEnabled(true);
                  ui->actionmodifier_le_psedo_d_anonimat->setVisible(false);
              }
          }
          void client::on_actionparametre_des_police_triggered()
          {
              bool ok = false;
          
              QFont police = QFontDialog::getFont(&ok, font() , this, "Choisissez une police");
          
              if (ok)
              {
                  ui->centralwidget->setFont(police);
              }
          }
          void client::on_conectbutton_clicked()
          {
              if(ui->conectbutton->text()=="reconection")
              ui->conectbutton->setEnabled(false); //on coupe le bouton pour ne pas se reconecter
              ui->serverip->setEnabled(false);
              ui->serveurport->setEnabled(false);
              socket->abort(); // On désactive les connexions précédentes s'il y en a
              ui->messagelist->append(tr("<em>Tentative de connexion en cours aux serveur primaire...</em>"));// On annonce sur la fenêtre qu'on est en train de se connecter
              socket->connectToHost(ui->serverip->text(), ui->serveurport->value()); // On se connecte au serveur demandé
          
          
          }
          void client::datareceived()
          {
              /* Même principe que lorsque le serveur reçoit un paquet :
                 On essaie de récupérer la taille du message
                 Une fois qu'on l'a, on attend d'avoir reçu le message entier (en se basant sur la taille annoncée tailleMessage)
                 */
                 QDataStream in(socket);
                 if (messagesize == 0)
                 {
                     if (socket->bytesAvailable() < (int)sizeof(quint16))
                          return;
                     in >> messagesize;
                 }
                 if (socket->bytesAvailable() < messagesize)
                     return;
                 // Si on arrive jusqu'à cette ligne, on peut récupérer le message entier
                 QString messagereceived;
                 in >> messagereceived;
          
              if(messagereceived.contains("/serveurPort_"))
              {
                  auto parts = messagereceived.split(QLatin1Char('_'));
                   //parts: {"serveurIP","127.0.01"}
                  talk_conect(ui->serverip->text(),parts[1].toInt());//on se conect au serveur de discution
              }else{
                ui->messagelist->append("<strong><i>autogénéré par le serveur primaire</i> -> erreur critique le serveur a envoyée un paquet mais votre programe ne parvient pas a le lire verifier les mise a jour</strong>");
              }
              ui->messagelist->append(messagereceived);
              messagesize = 0;//on remet a zero pour pouvoir recevoir d'autre message
          
          }
          
          void client::connected()
          {
              ui->serverip->setEnabled(false);
              ui->serveurport->setEnabled(false);
              ui->messagelist->append("conection reusi au serveur source !");
              ui->messagelist->append("en atante du serveur de discution vous ne pouvez pas discutée pour le moment vous alez etre redirigée automatiquement sur le serveur de discution ");
          }
          
          void client::disconnected()
          {
              ui->serverip->setEnabled(true);
              ui->serveurport->setEnabled(true);
              ui->messagelist->append("deconectée du serveur!");
              ui->messagelist->append("tentative de reconexion...");
              ui->conectbutton->click();
          }
          
          void client::socketerror(QAbstractSocket::SocketError error)
          {
              switch(error) // On affiche un message diff?rent selon l'erreur qu'on nous indique
              {
                  case QAbstractSocket::HostNotFoundError:
                      QApplication::alert(this);
                      ui->messagelist->append(tr("<em>ERREUR : le serveur source n'a pas pu étre trouvé. Vérifiez l'IP et le port car elle n'existe pas.</em>"));
                      ui->condensedlistmessages->setText(tr("<em>ERREUR : le serveur source n'a pas pu étre trouvé. Vérifiez l'IP et le port.</em>"));
                      break;
                  case QAbstractSocket::ConnectionRefusedError:
                      QApplication::alert(this);
                      ui->messagelist->append(tr("<em>ERREUR : le serveur source a refusé la connexion. Vérifiez si le programme \"serveur\" a bien été lancé. Vérifiez aussi l'IP et le port.</em>"));
                      ui->condensedlistmessages->setText(tr("<em>ERREUR : le serveur source a refusé la connexion. Vérifiez si le programme \"serveur\" a bien été lancé. Vérifiez aussi l'IP et le port.</em>"));
                      ui->conectbutton->setEnabled(true);
                      ui->serverip->setEnabled(true);
                      ui->serveurport->setEnabled(true);
                      break;
                  case QAbstractSocket::RemoteHostClosedError:
                       QApplication::alert(this);
                      ui->messagelist->append(tr("<em>ERREUR : le serveur source a coupé la connexion.</em>"));
                       ui->condensedlistmessages->setText(tr("<em>ERREUR : le serveur source a coupé la connexion.</em>"));
                      break;
                  default:
                      QApplication::alert(this);
                      ui->messagelist->append(tr("<em>ERREUR serveur source : ") + socket->errorString() + tr("</em>"));
                       ui->condensedlistmessages->setText(tr("<em>ERREUR serveur source : ") + socket->errorString() + tr("</em>"));
              }
              ui->conectbutton->setEnabled(true);
              ui->serverip->setEnabled(true);
              ui->serveurport->setEnabled(true);
          }
          
          
          
          
          
          
          //-----------------------------------------------serveur de discution-----------------------------------------------------------------------------------------------------------------------------
          void client::talk_conect(QString ip, int port)
          {
              sockettalk->connectToHost(ip,port);
          }
          void client::talk_conected()
          {
              ui->messagelist->append("conection reusi au serveur de discution !");
              ui->conectbutton->setEnabled(true);
              ui->actionfenaitre_condanc_e->setVisible(true);
              ui->conectbutton->setText("reconexion");
          }
          void client::talk_desconected()
          {
              ui->messagelist->append("deconectée du serveur!");
              ui->messagelist->append("tentative de reconexion...");
              ui->conectbutton->click();
          }
          void client::talk_datareceived()
          {
              /* Même principe que lorsque le serveur reçoit un paquet :
              On essaie de récupérer la taille du message
              Une fois qu'on l'a, on attend d'avoir reçu le message entier (en se basant sur la taille annoncée tailleMessage)
              */
              QDataStream in(socket);
          
              if (messagesizetalk == 0)
              {
                  if (sockettalk->bytesAvailable() < (int)sizeof(quint16))
                       return;
          
                  in >> messagesizetalk;
              }
          
              if (sockettalk->bytesAvailable() < messagesizetalk)
                  return;
          
          
              // Si on arrive jusqu'à cette ligne, on peut récupérer le message entier
              QString messagereceived;
              in >> messagereceived;
              if(ui->actionclignotement_de_la_fenetre->isChecked()==true)
              {
                  QApplication::alert(this);//je fait clignotée la fenetre
              }
              if(ui->actionjou_e_un_son->isChecked()==true)
              {
                  //QSound::play(("mysounds/fd.wav");
              }
              ui->messagelist->append(messagereceived); // On affiche le message
              ui->condensedlistmessages->setText(messagereceived);
              messagesizetalk = 0;//on remet a zero pour pouvoir recevoir d'autre message
          }
          void client::talk_socketerror(QAbstractSocket::SocketError error)
          {
              switch(error) // On affiche un message diff?rent selon l'erreur qu'on nous indique
              {
                  case QAbstractSocket::HostNotFoundError:
                      QApplication::alert(this);
                      ui->messagelist->append(tr("<em>ERREUR : le serveur de discution n'a pas pu étre trouvé. Vérifiez l'IP et le port car elle n'existe pas.</em>"));
                      ui->condensedlistmessages->setText(tr("<em>ERREUR : le serveur de discution n'a pas pu étre trouvé. Vérifiez l'IP et le port.</em>"));
                      break;
                  case QAbstractSocket::ConnectionRefusedError:
                      QApplication::alert(this);
                      ui->messagelist->append(tr("<em>ERREUR : le serveur de discution a refusé la connexion. Vérifiez si le programme \"serveur\" a bien été lancé. Vérifiez aussi l'IP et le port.</em>"));
                      ui->condensedlistmessages->setText(tr("<em>ERREUR : le serveur de discution a refusé la connexion. Vérifiez si le programme \"serveur\" a bien été lancé. Vérifiez aussi l'IP et le port.</em>"));
                      ui->conectbutton->setEnabled(true);
                      ui->serverip->setEnabled(true);
                      ui->serveurport->setEnabled(true);
                      break;
                  case QAbstractSocket::RemoteHostClosedError:
                       QApplication::alert(this);
                      ui->messagelist->append(tr("<em>ERREUR : le serveur de discution a coupé la connexion.</em>"));
                       ui->condensedlistmessages->setText(tr("<em>ERREUR : le serveur de discution a coupé la connexion.</em>"));
                      break;
                  default:
                      QApplication::alert(this);
                      ui->messagelist->append(tr("<em>ERREUR serveur de discution : ") + socket->errorString() + tr("</em>"));
                       ui->condensedlistmessages->setText(tr("<em>ERREUR serveur de discution : ") + socket->errorString() + tr("</em>"));
              }
              ui->conectbutton->setEnabled(true);
              ui->serverip->setEnabled(true);
              ui->serveurport->setEnabled(true);
          }
          void client::on_sendbutton_clicked()
          {
              if(ui->mesage->text()=="/clear")
              {
                  ui->messagelist->clear();
                  ui->mesage->clear();
              }else if(ui->mesage->text()=="/exit")
              {
                 qApp->quit();
              }else if(ui->mesage->text()=="/desconect")
              {
                  socket->abort();
                  ui->mesage->clear();
              }else if(ui->mesage->text()=="/reconect"){
                  ui->mesage->clear();
                  socket->abort();
                  sockettalk->abort();
                  socket->connectToHost(ui->serverip->text(), ui->serveurport->value());
              }else if(ui->mesage->text().contains("/serveurPort_")) {
                  ui->mesage->clear();
                  ui->mesage->setText("<strong><i> autogénéré par ANANTA SYSTEME</i> je vien de fair une betise ... j'ai tentée de violée la securitée globale du serveur j'ai donc été bani en\
                  atendant que le serveur choisisse ma sanction ne refaite pas ce qu je vien de fair</strong>");
                  ui->sendbutton->click();
                  QMessageBox::critical(this, "violation des droit","vous venez de tentée une violation la securitée du serveur... le serveur en sera avertie... un banisement lui sera proposer. \
                  \n vous éte bani jusca une reponse du serveur \n si vous refaite ca le tchat vous puniras. \n cella ne peut pas fonctionée car deux serveur sont a levre un de log et un de discution\
                  tu ne peut parelée que dans celui de discution");
                  ui->sendbutton->setEnabled(false);
              }else{
              QString hour = QDateTime::currentDateTime().toString("hh:mm:ss");//inisialisation de l'heur
              QString date = QDateTime::currentDateTime().toString("ddd dd MMM yyyy");
              QDateTime::fromString(hour, "hh:mm:ss");
          
              QByteArray package;//initialisation des package
              QDataStream out(&package, QIODevice::WriteOnly);
          
              QString messagetosend = tr("<strong><i>le ") + date + tr(" a ") +hour + tr(" ") + ui->username->text() +tr("</i></strong> a dit : ") + ui->mesage->text() + tr(" <br />");//envoi du message
              out << (quint16) 0;//on met 0 au debut du pac pour reserver pour la taille du pac
              out <<messagetosend;//on rajoute le message
              out.device()->seek(0);//on remplace le 0par la taille (les deux ligne) ↓
              out << (quint16) (package.size() - sizeof(quint16));//              celle ci
          
              socket->write(package); // On envoie le paquet
              ui->mesage->clear(); // On vide la zone d'écriture du message
              ui->mesage->setFocus(); // Et on remet le curseur à l'intérieur
              }
          
          }
          //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          client::~client()
          {
              delete ui;
          }
          
          • Partager sur Facebook
          • Partager sur Twitter
            2 janvier 2021 à 19:00:28

            l'erreur pourrais peut être venir de 
            auto parts = messagereceived.split(QLatin1Char('_'));
            car je ne suis pas sur que _ soit un QLatin1Char par qui je pourrais le remplacée ?
            • Partager sur Facebook
            • Partager sur Twitter
              2 janvier 2021 à 19:51:05

              _ est un caractère ascii, c'est donc forcément un caractère latin1. Mais tu dois vérifier que ton split retourne bien plusieurs éléments avant d'y accéder.

              -
              Edité par jo_link_noir 2 janvier 2021 à 19:51:20

              • Partager sur Facebook
              • Partager sur Twitter
                3 janvier 2021 à 15:07:06

                effectivement ca ne fonctionne pas pourtant j'ai mis : /serveurPort_123456 ca devrais donc me sotire "/serveurPort"  , "123456"

                non ?

                • Partager sur Facebook
                • Partager sur Twitter
                  3 janvier 2021 à 15:21:38

                  Et qu'est-ce qu'il sort à la place ?

                  Tu vois ce qui te reste à faire : écrire un programme qui

                  • met  "abc_123" dans une String
                  • le "splite" avec '_' comme délimiteur
                  • affiche les résultats.
                  et aussi :

                  -
                  Edité par michelbillaud 3 janvier 2021 à 15:22:29

                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 janvier 2021 à 17:27:30

                    après un teste ca fonctionne l'erreur dans le programme ne Vien donc pas de la.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 janvier 2021 à 17:45:31

                      Je ne voudrais pas me lancer dans des remarques sur l'orthographe assez variable dans le code, mais il semble que pas mal de constantes soient mal orthographiées

                      if(ui->mesage->text()=="/clear")
                          }else if(ui->mesage->text()=="/exit")
                          }else if(ui->mesage->text()=="/desconect")
                          }else if(ui->mesage->text()=="/reconect"){
                      


                      Si elles sont à comparer avec des messages reçus d'ailleurs, ça va poser un problème. L'ordinateur, il va pas chercher à comprendre.  Dans ces conditions, est-ce que  /serveurPort, ça ne serait pas /serverPort ?

                      -
                      Edité par michelbillaud 7 janvier 2021 à 17:47:45

                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 janvier 2021 à 20:00:50

                        oui je suis dyslexique des fois j'oublie des lettre dans les mot et je peut me relire 25 fois sans le remarquer

                        mais effectivement il est possible que je confonde serveurPort par serverport mais je ne comprends pas dans les exemple que tu a montrée il n'y a pas /serveurPort ou /serverport.

                        je regard plus en détail demain (et cette fois ci vraiment demain, désolée j'avais beaucoup de devoir)

                        • Partager sur Facebook
                        • Partager sur Twitter
                          7 janvier 2021 à 20:43:45

                          Salut ! Il y a bien un "serveurport" au tout début de ton premier message.

                          Pour debug un programme, on utilise un debuger. Si tu utilises un IDE, tu dois probablement en avoir un à ta disposition. Sinon tu passes par la ligne de commande, via gdb ou lldb, en oubliant pas de compiler ton code en mode "Debug" et pas "Release".

                          Le debuger te permet entre autre de suivre le parcours d'exécution d'un programme, et d'en analyser l'état (contenu des variables, fils d'exécution, analyse de l'assembleur généré etc.)

                          Je suis d'accord avec @michelbillaud. Néanmoins je dirais plus que, dans le cas d'un code comme le tien, qui n'est probablement écrit pour être publié, ou qui n'est pas susceptible d'être reviewed par d'autre développeurs, les fautes d'orthographes ne sont pas catastrophiques, dans la mesure ou elles ne sont pas visibles aux yeux des utilisateurs et qu'elles n'influent pas ton "coding style".

                          Ce qui reste important, c'est d'avoir un guide des bonnes pratiques syntaxiques et de la bonne disposition/structuration de ton code et de le respecter, pour que ton programme soit le plus maintenable possible et que tu aies un rythme de travail continu.

                          Voici plusieurs exemples de coding-style/guides bien connus d'entre les développeurs C++:

                          Certains vont plus loin que la syntaxe, mais comme ce ne sont pas des ouvrages à lire de façon linéaire tu peux facilement passer au chapitre que tu veux sans risquer de manquer quelque chose.

                          -
                          Edité par Daimyo_ 7 janvier 2021 à 20:57:21

                          • Partager sur Facebook
                          • Partager sur Twitter
                            8 janvier 2021 à 11:38:11

                            bonjour c'était effectivement le serveurport au premier message qui est censé être serverport

                            merci Daimyo_ pour ton poste. je lis tout attentivement mais en attendant sujet résolu ! 

                            • Partager sur Facebook
                            • Partager sur Twitter

                            erreur de segmentation

                            × 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