Partage
  • Partager sur Facebook
  • Partager sur Twitter

convertit QString en String

Sujet résolu
    21 juin 2018 à 12:00:51

    Merci beaucoup Koala01 tu m'as sauvé , le programme fonctionne bien maintenant pour le slot MaFenetre::onReadData je l'ai pas utilise j'ai stocke les donnees directement dans le slot addData() ; et j'essaie de definir slot addData() dans la classe Code mais j'arrive pas puisque je dois creer un objet MaFenetre pour lire LineEdit entry1 ce qui est causé le probleme des le debut
    • Partager sur Facebook
    • Partager sur Twitter
      21 juin 2018 à 17:59:42

      C'est bête de replonger à la mer juste après avoir été sauvé, et d'ajouter en plus du brouillard.

      Tu ne nous donnes rien, que ce soit comme explication sur ton projet, sa finalité... Tu ne nous donnes que des bouts de codes (et encore !) accompagnés d'explications vaseuses.

      koala01 a eu l'amabilité de te donner un code qui fonctionne, mais du peu que j'ai compris tu l'as rejeté pour revenir à ton point de départ.

      Avant de le rejeter en bloc cherche à comprendre ce code, comprendre sa logique, savoir comment il fonctionne. Et surtout poses-nous des questions sur les choses que tu ne comprends pas.

      -
      Edité par Squall31 21 juin 2018 à 18:00:26

      • Partager sur Facebook
      • Partager sur Twitter
        22 juin 2018 à 12:54:48

        Squall31 a écrit:

        C'est bête de replonger à la mer juste après avoir été sauvé, et d'ajouter en plus du brouillard.

        Tu ne nous donnes rien, que ce soit comme explication sur ton projet, sa finalité... Tu ne nous donnes que des bouts de codes (et encore !) accompagnés d'explications vaseuses.

        koala01 a eu l'amabilité de te donner un code qui fonctionne, mais du peu que j'ai compris tu l'as rejeté pour revenir à ton point de départ.

        Avant de le rejeter en bloc cherche à comprendre ce code, comprendre sa logique, savoir comment il fonctionne. Et surtout poses-nous des questions sur les choses que tu ne comprends pas.

        -
        Edité par Squall31 il y a environ 17 heures


        non j'utilise maintenant le code de koala01 il m'as sauve vraiment et j'ai bien compris son code , pour le moment j'ai un autre probleme je veux supprimer le tableau DataArray existe en chaque nouvelle clique sur le bouton avant de stocker les nouveaux donnees pour cela j'ecris la ligne suivante : 
                 graph->seriesList().at(0)->dataProxy()->resetArray(data);
        

        je l'ecris just avant d'entrer dans la boucle for qui lis les donnees du fichier et les stocke , le programme se compile bien et quand je tape le nom du fichier et je clique sur le bouton pour afficher les points  sur le graphe il s'affiche l'erreur suivant /

        • Partager sur Facebook
        • Partager sur Twitter
          22 juin 2018 à 15:53:19

          Une règle de base lorsque tu travailles avec des pointeurs, c'est de toujours vérifier si le pointeur (est sensé) pointe(r) vers une adresse valide.

          Une règle de base lorsque tu veux accéder à un élément particulier d'une collection (comme une QList), c'est de toujours t'assurer que l'élément existe.

          Ici, tu as deux pointeurs qui pourraient valoir nullptr et une liste qui pourrait ne pas contenir l'élément auquel tu souhaites accéder.  Cela fait trois raisons (sur une seule ligne !!! ) pour que ton programme plante :p

          Et encore : si data est un pointeur, cela pourrait faire une raison supplémentaire ;)

          Décompose ton code et assure toi que toutes les conditions sont remplies!  Cela donnera un code proche de

          if (graph!= nullptr){ // y a peut être pas de graphe
              auto & list=graph->serieList();
              if(! list.empty()){ // la liste est peut être vide
                  auto * proxy= list.at(0)->dataProxy();
                  if(proxy != nullptr) { // y apeut etre pas de proxy
                      proxy->resetArray(data);
              }
          }

          qui considérera comme "normal" que les éléments n'existent pas.  Mais on peut encore aller plus loin, et considérer que, si les éléments n'existent pas, c'est que le développeur "a fait une connerie" quelque part dans sa logique.

          On peut donc le forcer à corriger sa logique (en mode debug) en forçant le programme à "planter de manière controlée" au travers d'assertions.

          Le code pourrait ressembler à

          Q_ASSERT_X(graph!= nullptr, "read data", "graph doesn't exists);
          auto & list = graph->serieList();
          Q_ASSERT_X(!list.empty(), "read data", "list empty");
          auto * proxy= list.at(0);
          Q_ASSERT_X(list!= nullptr, "read data", "inexistant proxy");
          proxy->resetArray(data);



          • Partager sur Facebook
          • Partager sur Twitter
          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
            22 juin 2018 à 16:01:50

            koala01 a écrit:

            Une règle de base lorsque tu travailles avec des pointeurs, c'est de toujours vérifier si le pointeur (est sensé) pointe(r) vers une adresse valide.

            Une règle de base lorsque tu veux accéder à un élément particulier d'une collection (comme une QList), c'est de toujours t'assurer que l'élément existe.

            Ici, tu as deux pointeurs qui pourraient valoir nullptr et une liste qui pourrait ne pas contenir l'élément auquel tu souhaites accéder.  Cela fait trois raisons (sur une seule ligne !!! ) pour que ton programme plante :p

            Et encore : si data est un pointeur, cela pourrait faire une raison supplémentaire ;)

            Décompose ton code et assure toi que toutes les conditions sont remplies!  Cela donnera un code proche de

            if (graph!= nullptr){ // y a peut être pas de graphe
                auto & list=graph->serieList();
                if(! list.empty()){ // la liste est peut être vide
                    auto * proxy= list.at(0)->dataProxy();
                    if(proxy != nullptr) { // y apeut etre pas de proxy
                        proxy->resetArray(data);
                }
            }

            qui considérera comme "normal" que les éléments n'existent pas.  Mais on peut encore aller plus loin, et considérer que, si les éléments n'existent pas, c'est que le développeur "a fait une connerie" quelque part dans sa logique.

            On peut donc le forcer à corriger sa logique (en mode debug) en forçant le programme à "planter de manière controlée" au travers d'assertions.

            Le code pourrait ressembler à

            Q_ASSERT_X(graph!= nullptr, "read data", "graph doesn't exists);
            auto & list = graph->serieList();
            Q_ASSERT_X(!list.empty(), "read data", "list empty");
            auto * proxy= list.at(0);
            Q_ASSERT_X(list!= nullptr, "read data", "inexistant proxy");
            proxy->resetArray(data);



            okay merci beaucoup pour ton aide vraiment je suis pas beaucoup habituer a travailler avec les pointeurs , j'ai bien compris le code qui assure les conditions mais pour le 2eme code d'assertions je le comprends puisque j'ai jamais utiliser debugger

            -
            Edité par sou hail 22 juin 2018 à 16:06:53

            • Partager sur Facebook
            • Partager sur Twitter
              22 juin 2018 à 16:45:49

              ici, il s'agit d'une assertion propre à Qt, mais =>la doc<= devrait te donner toutes les informations voulues ;)

              Le premier code rentre dans une logique que l'on pourrait appeler de "programmation défensive": s'assure à chaque étape que l'on est en mesure de "passer à l'étape suivante".

              Le deuxième code rentre dans une logique de "programmation par contrat" définit un contrat simple entre le développeur d'une fonctionnalité et celui qui l'utilise : "donne moi des données correctes, tu obtiendras le résultat que tu attends".

              Si les données que l'utilisateur fournit sont incorrectes, il y a "rupture du contrat" et tout peut arriver parce que la logique de l'utilisateur pose problème.

              On décide donc de lui dire "hé mec!!! Tu t'es planté quelque part, parce que les données que tu m'a filées, c'est du grand n'importe quoi... dépêche toi de corriger cela". C'est, en gros, ce que va faire Q_ASSERT_X ;)

              Mais une fois qu'il aura corriger sa logique, la fonction devrait fournir le résultat que l'on attend de sa part.  Si bien que la vérification n'a plus de raison d'être quand le code passe en "production".  Le test (et l'engueulade qui va avec) seront donc purement et simplement supprimé de la version "release" du code ;)

              • Partager sur Facebook
              • Partager sur Twitter
              Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                2 juillet 2018 à 17:19:38

                Pour le moment j'ai le programme s’exécute mais il fait pas ce que je veux , je tape le nom du fichier il le lit et il fais ce qui est demande , et la deuxième  fois lorsque je tape un autre nom fichier il supprime les anciennes données et il fais tracer que les nouvelles données , mais dés la 3eme fois que je tape un nom du fichier il garde les anciennes données et il ajoute en plus les nouvelles , j'ai pas compris pourquoi il fonctionne bien juste lorsque il lit le 2eme fichier et après non et voila le nouveau code :   

                     void MaFenetre::addData(){
                     Code code(graph);
                     graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone);
                     graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront);
                         QScatterDataProxy *proxy = new QScatterDataProxy;
                         QtDataVisualization::QScatter3DSeries *series = new QtDataVisualization::QScatter3DSeries(proxy);
                         graph->addSeries(series);
                         QtDataVisualization::QScatterDataArray *data = new QScatterDataArray ;
                         graph->seriesList().at(0)->dataProxy()->resetArray(data);
                series->setItemLabelFormat(QStringLiteral("@xTitle: @xLabel @yTitle: @yLabel @zTitle: @zLabel "));
                         std::vector<point> inputData = code.readingData(entry1->text());
                         series->setMesh(QAbstract3DSeries::MeshPoint);
                         series->setBaseColor(QColor(205,89,55));
                                 for (int i=0; i<inputData.size();i++)
                {          data->push_back(QtDataVisualization::QScatterDataItem(QVector3D(inputData.at(i).x,inputData.at(i).y,inputData.at(i).z)));
                          series->dataProxy()->addItems(*data);
                }
                  }
                



                • Partager sur Facebook
                • Partager sur Twitter

                convertit QString en String

                × 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