Partage
  • Partager sur Facebook
  • Partager sur Twitter

Char* et strlen

Sujet résolu
    7 décembre 2019 à 13:18:27

    Bonjour,
    J'ai essayé d'écrire une classe vehicule et une classe Voiture qui hérite publiquement de la classe Vehicule
    le code n'affiche aucun erreur quand je fait la compilation , mais dans la fenêtre noire il n'affiche rien
    je pense que probleme et dans l'utilisation de strlen

    -
    Edité par Kurisu Makise 7 décembre 2019 à 17:55:04

    • Partager sur Facebook
    • Partager sur Twitter
      7 décembre 2019 à 13:56:35

      Il y a-t-il une raison particulière à ce que tu n'utilises pas le type idoine pour les chaines de caractères en C++, à savoir std::string?

      A supposer qu'un prof t'aie donné une telle consigne contre-pédagogique, découpe ton problème en sous problème. La bonne approche pour avoir un code robuste, et donc professionnel, est en plus une meilleure approche pédagogique. Si vraiment tu n'as pas le droit d'utiliser std::string, alors écrit une classe de chaine de caractères, et gères-y dedans tes chaines à la C. Gérer une ressource (char*) au niveau d'une classe métier plus complexe (voiture) est juste impossible à faire correctement (robuste, sans bug, maintenable...).

      Et si tu n'as pas de prof derrière toi, alors rends-toi service et abandonnes de ce pas l'utilisation des char*, et utilises std::string. Tu verras les pointeurs bruts dans 6  mois quand tu auras consolidé tes bases en C++. A ce moment là tu seras plus mûr pour comprendre pourquoi leur manipulation directe se doit être exceptionnelle.

      -
      Edité par lmghs 7 décembre 2019 à 13:58:31

      • 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.
        7 décembre 2019 à 14:29:34

        Tout d'abord, merci beaucoup pour la réponse rapide
        Oui, je suis d'accord avec toi
        Je sais qu'il vaut mieux utiliser sring que char* là
        Mais dans les instructions était nécessaire d'utiliser char*
        De plus, le prof nous a demandé d'utiliser strlen
        N'y a-t-il pas de solution car cet exercice peut l'inclure dans l'examen?
        Et merci
        • Partager sur Facebook
        • Partager sur Twitter
          7 décembre 2019 à 14:56:23

          char *Matricule =new....

          Tu déclares une variable locale au lieu d'utiliser le membre

          • 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.
            7 décembre 2019 à 14:59:13

            Bonjour,

            J'espère qu'au moins ton prof t'a bien précisé qu'il veut t'imposer l'utilisation une fonction strlen qui n'existe pas en C++ (mais comme le C++ tolère la syntaxe du langage C, il va comprendre cette fonction si on inclut <cstring> en évitant l'erreur d'utiliser <string.h>).

            Pour revenir à ton code. Vois-tu la différence entre ces deux codes?

             Marque = new char[ strlen(Marque) + 1 ];
             strcpy( Marque, a );
             Marque = new char[ strlen(a) + 1 ];
             strcpy( Marque, a );

            Et une autre question. C'est aussi ton prof qui conseille ces abominables 'casts' ?

             VoitureV1( (char*)"1234-A-50", (char*)"Fiat", 100000, 2007, 5 );
            • Partager sur Facebook
            • Partager sur Twitter

            En recherche d'emploi.

              7 décembre 2019 à 15:53:13

              merci beaucoup pour la réponse rapide encore une fois 

              En fait, j'essayais, j'ai oublié de le supprimer, je suis désolé

              char *Matricule =new....

              Au début j'ai essayé ensuite avec cstring puis j'ai utiliser string.h

              Honnêtement, je ne comprenais pas vraiment la différence entre eux, merci beaucoup

              super !! maintenant le code fonctionne 

              Il ne m'est jamais venu à l'esprit d'en faire utiliser le strlen sur a !! vraiment merci 

              Marque = new charstrlen(Marque) + 1 ];
              strcpy( Marque, a );

              j'ai utilise ça pour seulement éviter l'erreur ->[Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]

              VoitureV1( (char*)"1234-A-50", (char*)"Fiat", 100000, 2007, 5 );

              une autre question stp , est ce que je dois changement le strlen dans le constructeur par recopie parce que le code ne fonctionne pas quand j'ai tester avec la classe voiture 

              Marque=new char[strlen(f.Marque)];

              strcpy(Marque,f.Marque);

              • Partager sur Facebook
              • Partager sur Twitter
                7 décembre 2019 à 17:12:09

                Le problème, c'est que lorsque tu alloues avec new, tu dois obligatoirement avoir un unique delete correspondant. S'il n'y est pas, tu as une fuite de mémoire, si on ne regarde pas de trop près, ça semble marcher... sauf qu'au fil des allocations, la mémoire utilisée par le programme augmente et au bout d'un moment, tu ne peux plus faire d'allocation et boum! Le delete doit être unique, lorsque tu delete, la mémoire est rendue et peut donc être réutilisée, mais si tu refais un delete, tu libères de la mémoire qui ne t'appartient plus et qui a peut être déjà été réaffectée, c'est un comportement indéfini, au mieux ça plante tout de suite, au pire ça plante un peu plus loin en ayant eu le temps de ravager la mémoire...

                Vu que Voiture dérive de Véhicule, tu as une sémantique d'entité. Une entité a une propriété intrinsèque: elle est unique! Tu es une entité, je peux te cloner, mais pas te copier, une instance de Voiture est une entité, on ne devrait pas pouvoir la copier, du coup le constructeur de copie et l'opérateur d'assignation ne devraient pas exister. Une Voiture est un Véhicule, une Moto est un Véhicule, mais une Moto n'est pas une Voiture, donc la copie n'a conceptuellement aucun sens.

                En C++ moderne (c++11 et suivants), on interdit explicitement au compilateur de fournir une implémentation par défaut: 

                class Voiture : public Vehicule
                {
                
                    Voiture(Voiture const &) = delete;
                    Voiture & operator = (Voiture const &) = delete;
                
                };

                En C++ classique (avant c++11), on déclare les deux dans la partie privée de la classe, sans les implémenter. Ainsi, le compilateur ne peut plus fournir des implémentations par défaut, et si jamais ils sont utilisés, il y aura une erreur de link qui sera la conséquence d'une erreur dans le programme, étant donné que ces fonctions ne devraient pas exister dans une classe à sémantique d'entité.

                Non seulement ton prof semble avoir quelques millions d'années de retard sur la programmation en c++, mais en plus ses notions de conception me paraissent être des plus limitées (pour rester courtois).

                -
                Edité par int21h 7 décembre 2019 à 17:22:57

                • Partager sur Facebook
                • Partager sur Twitter
                Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                  7 décembre 2019 à 18:34:49

                  Merci beaucoup
                  J'ai tout compris maintenant
                  En fait, c'est le genre d'erreur que je vois maintenant
                  Enfin, quelqu'un ressent notre souffrance
                  je veux te demander quelque chose
                  Veuillez supprimer ce sujet dans ce site car si mon professeur le trouve
                  Il saura que je l'ai écrit
                    Parce que la dernière fois
                  je me suis disputé avec lui
                  Et il pourrait me donner un mauvaise note 
                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 décembre 2019 à 17:04:38

                    Si ton prof a lu ce sujet et qu'il n'est pas idiot, il comprendra peut être, que la sale note, ce n'est pas toi qui la mérite, mais lui... Après s'il n'est pas d'accord avec ça, il peut se créer un compte et venir parler de c++ avec nous, tu devrais d'ailleurs peut être le lui suggérer, il y apprendrait probablement pas mal de choses utiles, comme par exemple, le c++ moderne, les sémantiques de classes, le concept de RAII, SOLID,... bref le minimum vital, pour arriver à torcher un programme c++ qui ne se contentera pas de marcher dans le monde merveilleux des bisounours...

                    -
                    Edité par int21h 8 décembre 2019 à 17:12:54

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug

                    Char* et strlen

                    × 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