Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur amélioration premier TP

Je commence le C++

Sujet résolu
    3 juin 2008 à 17:18:09

    Bonjour à tous!

    Alors voilà ça fait un petit moment que j'ai lu les deux premiers parties du cours C, et j'ai décider de me mettre au C++.
    J'en suis au premier TP: ZString.
    Je dois avouer qu'il est très intéressant, j'ai essayer de trouver moi même le bon code avant de regarder comment là fais M@téo, et je dois avouer que c'est très enrichissant. Donc un très bon TP.
    Seulement voilà j'ai un problème pour les améliorations, je suis à la méthode recherche, voici mon code:
    ZString ZString::recherche(const char lettre)
    {
        int i = 0, j = 0;
    
        char caractereActuel = NULL;
        while(caractereActuel != '\0' || caractereActuel != lettre)
        {
            caractereActuel = m_chaine[i];
            i++;
        }
        if (caractereActuel == lettre)
        {
            char *resultatRecherche = new char[m_longueur+1];
            while(i<m_longueur)
            {
                resultatRecherche[j] = m_chaine[i];
                i++;
                j++;
            }
            resultatRecherche[j] = '\0';
            ZString resultat(resultatRecherche);
            delete[] resultatRecherche;
            return resultat;
        }
        else
        {
            return NULL;
        }
    }
    


    Seulement lorsque je test:
    ZString chaine("Bonjour !");
        chaine.afficher();
        chaine = "Hello de lu !";
        chaine.afficher();
        ZString autreChaine("Comment vas-tu ?");
        autreChaine.afficher();
        ZString troisiemeChaine(autreChaine);
        troisiemeChaine.afficher();
        troisiemeChaine = "Bonjour !";
        troisiemeChaine.afficher();
        chaine.afficher();
        chaine = troisiemeChaine + " " + autreChaine;
        chaine.afficher();
        cout << "chaine : " << chaine << endl << "autreChaine : " << autreChaine << endl << "troisiemeChaine : " << troisiemeChaine << endl;
        ZString resultat = chaine.recherche("v");
        resultat.afficher();
    


    Je n'ai pas d'erreur du compilateur, mais voici ma console:
    Bonjour !
    Hello de lu !
    Comment vas-tu ?
    Comment vas-tu ?
    Bonjour !
    Hello de lu !
    Bonjour ! Comment vas-tu ?
    chaine : Bonjour ! Comment vas-tu ?
    autreChaine : Comment vas-tu ?
    troisiemeChaine : Bonjour !
    °>=
    
    Process returned 0 (0x0)   execution time : 0.000 s
    Press any key to continue.


    Je ne vois pas d'où viens ce "°>=".
    Merci d'avance pour votre aide.
    • Partager sur Facebook
    • Partager sur Twitter
      3 juin 2008 à 20:02:34

      Regarde sur le tuto de m@teo qui , grpace au code , retire certain incoveniants come ;

      chaine.afficher();
      ZString autreChaine("Comment vas-tu ?");
      autreChaine.afficher();
      ZString troisiemeChaine(autreChaine);
      troisiemeChaine.afficher();
      troisiemeChaine = "Bonjour !";
      troisiemeChaine.afficher();
      chaine.afficher();

      tu DOIT LIRE CE COUR il apprend de nouvelle manière de simplifier l'utilisation d'une classe
      après tu peux toujours essayer de faire tout seul mais lit au moinla trame dirrective de ce TP sinon tu ne pourras pas faire la classe ZString sans des difference avec String!!!!
      • Partager sur Facebook
      • Partager sur Twitter
        3 juin 2008 à 20:14:56

        J'ai bien suivit la trame, mon main est comme ça car je testais les différentes méthode, elle marches toutes, mais je bloque à la méthode recherche, comme tu peux le constater le main utilise a peu près toutes les méthodes...

        Mon problème n'a rien à voir avec le main, ici juste pour montrer comment j'obtiens la console.
        • Partager sur Facebook
        • Partager sur Twitter
          3 juin 2008 à 21:03:45

          Je pense qu'il faudrait que tu répondes aux questions suivantes :

          1) Qu'est-ce que tu cherches ?
          2) Dans quoi est-ce que tu cherches ?
          3) Quel sera le résultat de ta recherche (Quelle sera l'information que tu vas renvoyer à la personne qui fait la recherche) ?

          Une fois ces points clarifiés pour toi, je pense que tu seras plus à même de corriger ton code.
          Si ça ne joue toujours pas, reviens.
          • Partager sur Facebook
          • Partager sur Twitter
          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
            3 juin 2008 à 21:33:06

            1) Je recherche un caractère.
            2) Je le cherche dans une chaîne de caractère.
            3) L'information envoyée sera une chaîne copie(ZString) de la première à partir du caractère recherché ou NULL.

            Donc j'essaye de faire l'équivalent de strchr dans ma classe. Bien sur sans utiliser strchr.

            Merci pour tout.

            EDIT: Après essai avec une fonction C qui devait reproduire strchr qui marchait (je l'avais écrit lors du tuto dans C sur les chaîne de caractère), il semblerait que c'est le return qui cause quelques difficultés...
            • Partager sur Facebook
            • Partager sur Twitter
              3 juin 2008 à 21:54:31

              Tu joues avec des détails bas-niveau au lieu des ZString ...
              A partir du moment où tu as la position de départ, vu que tu es sensé avoir le constructeur qui va bien, tu n'as rien à allouer.

              Seuls les constructeurs, ou une éventuelle fonction reserve() devraient être autorisés à allouer (directement) dans une classe de chaines de caractères.
              • 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.
                3 juin 2008 à 22:14:01

                J'alloue provisoirement un char* pour copier lettre par lettre l'attribut m_chaine. Je le delete[] avant le return.
                • Partager sur Facebook
                • Partager sur Twitter
                  3 juin 2008 à 22:30:48

                  Aucun intérêt, allouer est le rôle du constructeur de conversion. Le pointeur qui va bien, tu l'as déjà.
                  • 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.
                    3 juin 2008 à 22:59:08

                    En effet après réflexion, je n'ai pas besoin d'allouer de nouveau.
                    J'ai modifier mon code précédent:
                    ZString ZString::recherche(char lettre) const
                    {
                        if(m_chaine == 0)
                        {
                            return 0;
                        }
                        int i = 0;
                    
                        char caractereActuel = m_chaine[i];
                        while(caractereActuel != '\0' && caractereActuel != lettre)
                        {
                            caractereActuel = m_chaine[i];
                            i++;
                        }
                        if (caractereActuel == lettre)
                        {
                            ZString resultat(m_chaine+i);
                            return resultat;
                        }
                        else
                        {
                            return 0;
                        }
                    }
                    


                    Et:

                    ZString resultat = chaine.recherche("j");
                        if(resultat.getChaine() != 0)
                        {
                            cout << resultat << endl;
                        }
                    


                    Sachant que chaîne est un objet ZString = "Bonjour ! Comment vas-tu ?" Seulement j'ai toujours le même problème, je n'y comprends plus rien.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 juin 2008 à 23:21:41

                      Un problème dans tes copies et affections?

                      Sinon, tu ne devrais pas renvoyer 0, mais ZString() ;
                      et avec ton while, quand tu trouves, tu es un indice trop loin.

                      Accessoirement, ta fonction recherche() (qui porte mal son nom) reçoit une chaine et non un caractère. Ce n'est donc pas la surcharge que tu nous montres qui est appelée vu le main() de ton premier message.
                      • 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.
                        4 juin 2008 à 0:20:59

                        Je dois mettre quoi dans le main pour que ça considère un caractère et non une chaîne?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 juin 2008 à 0:25:06

                          'j' et pas "j"
                          • 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.
                            4 juin 2008 à 0:39:03

                            Merci beaucoup, j'avais pourtant déjà essayer avec 'j' mais sa buguais toujours (mais c'était avec l'ancien code).
                            En tout cas ça fonctionne merci!!
                            Et en effet il fallait bien mettre ZString() et non 0.

                            EDIT: Une fois que tu as compris le système, ça vas tout seul, voici la méthode recherche surchargée:
                            ZString ZString::recherche(const char* chaine) const
                            {
                                if(m_chaine == 0)
                                {
                                    return ZString();
                                }
                                int nbrLettre = longueur(chaine);
                                char caractereActuel = m_chaine[0];
                            
                                for(int i = 0;i < m_longueur;i++)
                                {
                                    caractereActuel = m_chaine[i];
                                    for(int j = 0;j < nbrLettre;j++)
                                    {
                                        if(caractereActuel == chaine[j])
                                        {
                                            ZString resultat(m_chaine+i);
                                            return resultat;
                                        }
                                    }
                                }
                                return ZString();
                            }
                            
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Erreur amélioration premier TP

                            × 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