Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec std::vector

    27 novembre 2019 à 12:05:45

    Bonjour à tous,

    J'utilise un vecteur pour stocker des données de type <double tmp, double voltage>.

    Les données en voltage sont du type : 20,12345678

    Sauf que quand je demande d'accéder au ième élément, j'obtiens : 20,1234.

    Savez-vous pourquoi? Et comment faire pour obtenir la valeur non tronquée?

    D'avance, merci.

    • Partager sur Facebook
    • Partager sur Twitter
      27 novembre 2019 à 12:17:57

      Salut,

      En mémoire, ça ne doit pas être tronqué, a moins que tu l'ais volontairement tronqué.

      C'est probablement l'affichage, montre nous un bout de code, comment tu affiches ta valeur.

      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        27 novembre 2019 à 12:31:50

        Bonjour,

        J'affiche pas vraiment la valeur mais je la stocke dans un fichier .txt.

        Voici le code :

        QTextStream flux(&datasToSave);
        for (int i = 0; i < m_Datas.size(); i++)
        		{
        			double tps = i / static_cast<double>(m_SampleRate);
        			flux << tps << ";" << m_Datas.at(i) << "\n";
        		}

        avec m_Datas : std::vector

        Peut être modifier en QVector sera déjà une bonne solution

        -
        Edité par ThugYo 27 novembre 2019 à 12:42:11

        • Partager sur Facebook
        • Partager sur Twitter
          27 novembre 2019 à 13:40:27

          Essaie ça :

          flux << tps << ";" << std::setprecision(10) << m_Datas.at(i) << "\n";



          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

            27 novembre 2019 à 14:05:24

            ça ne compile pas.

            Message d'erreur : message : lors de la tentative de mise en correspondance de la liste des arguments '(QTextStream, std::_Smanip<std::streamsize>)'

            J'ai modifié mon std::vector en QVector mais ça ne change rien.

            Pourtant, le vecteur contient bien la valeur 20.12345678 mais quand je fais monVecteur.at(i) ou monVecteur.value(i), j'obtiens toujours 20.1234

            -
            Edité par ThugYo 27 novembre 2019 à 14:41:24

            • Partager sur Facebook
            • Partager sur Twitter
              27 novembre 2019 à 14:52:29

              Il y a une méthode value sur std::vector ?

              Met nous un peu plus de code.

              • Partager sur Facebook
              • Partager sur Twitter

              Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                27 novembre 2019 à 15:01:04

                J'ai modifié mon std::vector en QVector mais ça ne change rien.

                Pourtant, le vecteur contient bien la valeur 20.12345678 mais quand je fais monVecteur.at(i) ou monVecteur.value(i), j'obtiens toujours 20.1234

                • Partager sur Facebook
                • Partager sur Twitter
                  27 novembre 2019 à 15:02:00

                  Salut,

                  Pour info : pour utiliser std::setprecision, il faut inclure le fichier <iomanip>, car autrement, le compilateur ne comprend pas ce qu'on lui veut ;)

                  As tu bien inclus ce fichier?

                  EDIT : Mouarf, je viens, en lisant la doc de iomanip, de découvrir quelque chose que j'ignorais depuis 8 ans: get|set_money et get|set_time :p

                  -
                  Edité par koala01 27 novembre 2019 à 15:06:32

                  • 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
                    27 novembre 2019 à 15:02:42

                    Bon, c'est bon ça fonctionne. La méthode setprecision ne fonctionne pas avec QTextStream et il faut utiliser la méthode qSetRealNumberPrecision(int number).

                    Merci pour le coup de main!

                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 novembre 2019 à 16:12:05

                      Ce qu'il y a à retenir, c'est que peu importe si tu stockes ça sous un std::vector<double> un qvector<double> ou un CequeTuVeux<double>, dedans ce sont des double.

                      Un double c'est environ 13 chiffres significatifs, donc en mémoire, tu as largement la précision dont tu as besoin. Changer de conteneur ne sert à rien.

                      C'est juste au moment ou tu veux l'afficher que tu choisis avec combien de digits tu l'affiches. 

                      A noter aussi que tu devrais utiliser un debuggueur : le debuggueur te donne les double avec suffisamment de chiffres significatifs.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                        28 novembre 2019 à 11:51:37

                        ThugYo a écrit:

                        quand je fais monVecteur.at(i) ...

                        PS: A moins que tu aies une raison très valable, n'utilise pas la fonction at(), car elle inclue une validation de l'indice, ce qui ruine les perfs, n'apporte rien, masque une erreur de programmation potentielle.
                        Préfère la notation en tableaux (l'operateur []).

                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 novembre 2019 à 13:46:13

                          Deedolith a écrit:

                          ThugYo a écrit:

                          quand je fais monVecteur.at(i) ...

                          PS: A moins que tu aies une raison très valable, n'utilise pas la fonction at(), car elle inclue une validation de l'indice, ce qui ruine les perfs, n'apporte rien, masque une erreur de programmation potentielle.
                          Préfère la notation en tableaux (l'operateur []).

                          Et mieux encore: utilise de préférence la boucle basée sur les intervalles qui est disponible depuis C++11:

                          for(auto it : Datas)
                              flux<< it<<";"

                          vu que tu veux, de toutes manières, parcourir l'ensemble de ta collection, c'est beaucoup plus simple, et beaucoup moins sujet à erreur ;)


                          • 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
                            6 décembre 2019 à 11:33:35

                            Hello,

                            Merci pour vos réponses et pour vos conseils d'amélioration. C'est noté et compris :)

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Problème avec std::vector

                            × 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