Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème classe BigInt

invalid conversion from `char' to `const char*'

Sujet résolu
    8 mai 2008 à 12:10:16

    Bonjour à tous !

    Je suis en train de faire le 2e exercice de C++ de ce topic, où le but est de créer une classe BigInt permettant de stocker de très grands nombres.

    Mais j'ai déja un problème au niveau du constructeur ^^ . Voici mon code :

    BigInt.cpp :
    #include "BigInt.hpp"
    
    BigInt::BigInt(const int nombre)
    {
        //le flux pour convertir le nombre en string
        ostringstream oss;
        oss << nombre;
        string chaine = oss.str();
    
        //on redimensionne le tableau
        m_nombre.resize(chaine.size());
    
        for(int i = 0; i < chaine.size(); i++)
        {
            //c'est là que ça bug
            string caractere = chaine.at(i);
            istringstream iss(caractere);
            iss >> m_nombre[i];
        }
    }
    


    BigInt.hpp :
    #ifndef DEF_BIGINT
    #define DEF_BIGINT
    
    using namespace std;
    
    //quelques includes
    #include <iostream>
    #include <vector>
    #include <sstream>
    
    class BigInt
    {
        public :
    
        //le constructeur
        BigInt(const int nombre);
    
        protected :
    
        //le tableau qui stocke le nombre
        vector<int> m_nombre;
    };
    
    #endif
    


    Et voilà ce que j'obtiens à la compilation :
    Compiling: BigInt.cpp
    C:\Program Files\CodeBlocks\BigInt\BigInt\BigInt.cpp: In constructor `BigInt::BigInt(int)':
    C:\Program Files\CodeBlocks\BigInt\BigInt\BigInt.cpp:11: warning: comparison between signed and unsigned integer expressions
    C:\Program Files\CodeBlocks\BigInt\BigInt\BigInt.cpp:13: error: invalid conversion from `char' to `const char*'
    C:\Program Files\CodeBlocks\BigInt\BigInt\BigInt.cpp:13: error:   initializing argument 1 of `std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]'
    Process terminated with status 1 (0 minutes, 0 seconds)
    2 errors, 1 warnings


    Merci d'éclairer ma lanterne :magicien: .
    • Partager sur Facebook
    • Partager sur Twitter
      8 mai 2008 à 12:35:56

      Le constructeur de l'istringstream attend une chaine (char const*), et tu lui passe un seul caractère.

      Mais ... tu te compliques la vie. La valeur du chiffre, c'est ch[i]-'0'. Mais mieux vaut réaliser des divisions successives par 10, et stocker les restes dans ton vecteur.
      Comme ça, pour pourras migrer naturellement vers un stockage plus efficace en base 2^sizeof(int).
      • Partager sur Facebook
      • Partager sur Twitter
      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
        8 mai 2008 à 12:41:52

        Ok , je m'y mets tout de suite :) . Si je comprends bien, je dois me servir de la taille du nombre et des puissances de 10 ?
        • Partager sur Facebook
        • Partager sur Twitter
          8 mai 2008 à 13:26:03

          Commence par le stockage en base 10 si cela te parait plus naturel.
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            8 mai 2008 à 13:28:05

            En fait, je ne comprends pas très bien cette histoire de base ^^ .
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              8 mai 2008 à 13:33:01

              en base 10 cest les nombre habituel.
              la base 2 c'est le binaire (01001..)
              la base 16 c'est l'exadecimal (0xFF5E)

              en faite les base c'est le systeme de numeration. Mais si tu as du mal a suivre, utilise la base 10 sans te compliquer la vie.
              • Partager sur Facebook
              • Partager sur Twitter
                8 mai 2008 à 13:36:25

                Citation : lmghs

                Comme ça, pour pourras migrer naturellement vers un stockage plus efficace en base 2^sizeof(int).


                Ce serait pas plutôt 2^(8*sizeof(int)) ?

                En remplaçant bien sûr 8 par le nombre de bit dans un byte. (D'ailleurs faut que je cherche comment on peut l'obtenir).

                Edit : on peut utiliser numeric_limits<T> à la place de 8*sizeof(T) ?
                • Partager sur Facebook
                • Partager sur Twitter
                  8 mai 2008 à 13:50:30

                  Tout à fait tealc.

                  (Maintenant c'est au programme de quelle classe les bases (décimale, ...) en maths ?)
                  • Partager sur Facebook
                  • Partager sur Twitter
                  C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                    8 mai 2008 à 13:52:57

                    Citation : lmghs

                    Tout à fait tealc.

                    (Maintenant c'est au programme de quelle classe les bases (décimale, ...) en maths ?)



                    Je l'avais fait en MPI en seconde, mais jamais en math!
                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 mai 2008 à 14:32:32

                      Ah ok pas étonnant que je sache pas ce que c'est je suis en 3e ^^ .
                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 mai 2008 à 15:09:22

                        Petite question: je vois très bien comment remplir mon vecteur en base 256^n, Si le constructeur prend un argument un int, long ou autre.
                        Cependant, je ne vois pas du tout comment faire si l'argument est un string, écrit en base 10! En effet, tous les outils (modulo, division, etc...) ne sont pas disponibles.

                        Pouvez vous m'aider?

                        A+
                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 mai 2008 à 16:56:17

                          tu transforme ta std::string en nombre
                          • Partager sur Facebook
                          • Partager sur Twitter
                            8 mai 2008 à 17:39:30

                            Citation : Chlab_lak

                            tu transforme ta std::string en nombre


                            Oui mais s'il est en train de créer une classe de gestion des grands nombres, le nombre stocké dans la string ne rentre pas dans un int (ou autre).
                            • Partager sur Facebook
                            • Partager sur Twitter
                              8 mai 2008 à 18:40:35

                              Comme a dit Tealc13: le plus grand nombre que puisse contenir un unsigned int est 4294967296. Or, l'idée est de créer une classe gérant des entiers de taille beaucoup, beaucoup plus grande.

                              A+
                              • Partager sur Facebook
                              • Partager sur Twitter
                                8 mai 2008 à 19:08:56

                                bah tu decoupes ta chaine en plusieurs nombres, puis tu operes sur chaque nombre (op+=())
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  8 mai 2008 à 20:46:07

                                  L'idée est de prendre la string et de mettre chaque char dans une case d'un vector de short int, de telle sorte que le short int ait la même valeur (donc pas ASCII) que le char sus-nommé.

                                  P.S. :C'est pas souvent que je place "sus-nommé" sur un forum d'info...
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                    8 mai 2008 à 22:00:23

                                    en clair si le nombre est 100 (pour faire simple)
                                    ton tableau sera
                                    [1][0][0] et la méthode pour ecrire le chiffre devra parcourir tout le tableau.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      9 mai 2008 à 9:30:21

                                      Citation : Nanoc

                                      L'idée est de prendre la string et de mettre chaque char dans une case d'un vector de short int, de telle sorte que le short int ait la même valeur (donc pas ASCII) que le char sus-nommé.

                                      P.S. :C'est pas souvent que je place "sus-nommé" sur un forum d'info...



                                      Ben justement c'est à ça que je pensais, et je reviens donc à mon premier problème
                                      (voir en haut de la page ^^ ).
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        9 mai 2008 à 10:03:27

                                        Tu fais string = char, ce qui n'est pas possible à la construction (constructeur explcite). Tu dois faire:

                                        string caractere(chaine.at(i));

                                        2 questions me viennent à l'esprit:

                                        1) Pourquoi mettre ça dans une string ?
                                        2) Pourquo utiliser at() ?

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                          9 mai 2008 à 10:12:57

                                          J'ai essayé de mettre dans une string parce que quand je met ce code :
                                          for(int i = 0; i < chaine.size(); i++)
                                          {
                                              istringstream iss(chaine[i]);
                                              iss >> m_nombre[i];
                                          }
                                          

                                          Le compilateur me met ça comme erreur :
                                          C:\Program Files\CodeBlocks\BigInt\BigInt\BigInt.cpp:28: error: invalid conversion from `char' to `std::_Ios_Openmode'
                                          C:\Program Files\CodeBlocks\BigInt\BigInt\BigInt.cpp:28: error:   initializing argument 1 of `std::basic_istringstream<_CharT, _Traits, _Alloc>::basic_istringstream(std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]'
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            9 mai 2008 à 11:24:33

                                            for(int i = 0; i < chaine.size(); i++)
                                            {
                                            int temp;
                                            istringstream iss(chaine[i]);
                                            iss >> temp;
                                            m_nombre[i] = temp;
                                            }
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                              9 mai 2008 à 11:35:28

                                              Dsl mais j'ai toujours la même chose :( .
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                9 mai 2008 à 11:54:40

                                                Ah oui mais je suis bête, j'ai corrigé la mauvaise ligne...

                                                Tu ne peux pas ouvrir un flux sur une chaine en lui donnant un char comme argument !

                                                istringstream iss(chaine);

                                                sera correct. Mais pour lire un "int" après l'autre ce sera embêtant.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                                  9 mai 2008 à 12:16:43

                                                  Donc la méthode que j'utilise n'est pas bonne ?
                                                  Rhaa la la je comprends plus rien ^^ ...
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    9 mai 2008 à 14:08:24

                                                    Dans tous les cas tu vas devoir implémenter à la main des fonctions de changement de base, soit en gros de conversion nombre <=> chaine. (tu n'as pas le choix car tu ne pourras pas utiliser les stringstream pour ton nouveau type)

                                                    On en a déjà parlé plusieurs fois sur le forum.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                                                      9 mai 2008 à 14:25:33

                                                      tu veux convertir un char en int -> Google
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                                        9 mai 2008 à 14:38:42

                                                        Ouf, j'ai enfin réussi !

                                                        Merci à tous pour vos réponses, surtout toi lmghs :) , j'ai créé une fonction de conversion et ça marche maintenant.
                                                        (maintenant que le constructeur est terminé faut passer aux opérateurs :lol: )
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        Problème classe BigInt

                                                        × 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