Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pointeurs de pointeurs sur Char... :s

Help please...

Sujet résolu
    31 décembre 2007 à 18:41:39

    Salut à tous,

    Voici mon probleme... j'ai ecrit une fonction qui prend en parametre un tableau de pointeur de char et qui va ajouter une chaine de caractere saisie par l'utilisateur ( c'est a dire il ajoute un pointeur dans le tableau qui pointera vers cette chaine de caractere).

    L'allocation de memoire est dynamique en fonction de la saisie de l'utilisateur.

    Il y a un element supplementaire: Le tableau de pointeur doit comporter un nombre d'elements multiple de 5, c'est a dire que si l'utilisateur ajoute une chaine de caractere a un tableau comportant deja 5 elements, la fonction va affecter au tableau 10 elements. C'est pourquoi j'envoie a la fonction le nombre d'elements deja presents dans le tableau.

    voici mon code:

    1. void add(char **VEC,int &nombre)
    2. {
    3.         char A[50],**TMP;
    4.         cin>>A;
    5.         if (nombre%5==0 && nombre!=0)
    6.         {
    7.                 TMP=new char*[nombre+5];
    8.                 for (int i=0;i<nombre;i++)
    9.                         *(TMP+i)=*(VEC+i);
    10.                 delete[] VEC;
    11.                 VEC=TMP;
    12.         }
    13.         *(VEC+nombre)=new char[strlen(A)+1];
    14.         strcpy(*(VEC+nombre),A);
    15.         nombre++;
    16.         for (int i=0;i<nombre;i++)
    17.                 cout<<*(VEC+nombre)<<endl;
    18.         //tri(VEC);
    19. }
    20. int main()
    21. {
    22. char **VEC;
    23. int x,menu,nombre=0;
    24. VEC=new char*[5];
    25. while (1)
    26. {
    27.         cin>>menu;
    28.         switch (menu)
    29.         {
    30.         case 1:add(VEC,nombre);
    31.                 break;
    32.         case 2://delete_string(VEC,nombre);
    33.                 break;
    34.         case 3://search(VEC,nombre);
    35.                 break;
    36.         case 4://print_spec(VEC,nombre);
    37.                 break;
    38.         case 5://print_all(VEC,nombre);
    39.                 break;
    40.         default:return 0;
    41.         }
    42. }


    Mon probleme se situe au niveau de l'affichage des elements existants par cout dans la fonction... Cela me donne une erreur du type Access violation reading location
    Access violation reading location


    Quel est le probleme ?

    Et si vous avez des suggestions sur le code n'ehesitez pas :p

    @++
    • Partager sur Facebook
    • Partager sur Twitter
      31 décembre 2007 à 20:44:02

      Parce que "new type(nombre)" n'alloue pas un tableau ... ?

      PS: std::vector<std::string> c'est bien aussi
      • 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.
        31 décembre 2007 à 20:55:33

        erf... tout est un probleme de parenthese ??? j'ai changé celles ci en crochet mais j'ai toujours l'erreur...
        • Partager sur Facebook
        • Partager sur Twitter
          1 janvier 2008 à 11:32:21

          Je pige rien à ton code tellement il est tordu mais quand je vois un "delete[] VEC" puis "VEC=TEMP" je prend peur car VEC est modifier, certes mais le VEC du main lui reste intact: le delete libère la mémoire mais VEC pointe encore sur le même endroits. Pour régler ton problème il faudrait peut-être passer VEC par référence. Mais je ne comprend pas non plus pourquoi tu utilise des pointeurs de pointeurs !
          Bref je te conseille std::string et std::vector: çà rend le code beaucoup plus clair.
          • Partager sur Facebook
          • Partager sur Twitter
            1 janvier 2008 à 12:11:01

            je n'ai pas encore le niveau de std::string toussa...

            Donc je ne pense pas que je peut faire ceci sans passer par un tableau de pointeurs...

            Mon code est tordu ? pk donc ? tu pourrait me donner des exemples ?

            Sinon quand je fais delete[], j'ai tout d'abord recupéré les informations precedentes dans un nouveau tableau de pointeurs TMP pour ensuite apres le delete[] recuperer ces informations avec VEC=TMP. Ca ne fonctionne pas comme ca ?
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              1 janvier 2008 à 12:58:33

              "je n'ai pas encore le niveau de std::string"

              Utiliser std::string est plus facile que manier des tableaux des char && co.
              • Partager sur Facebook
              • Partager sur Twitter
                1 janvier 2008 à 13:18:29

                Citation : Davidbrcz

                "je n'ai pas encore le niveau de std::string"

                Utiliser std::string est plus facile que manier des tableaux des char && co.



                Surement sauf que j'ai des exercices à effectuer sur un certain sujet, avec des methodes demandées...Surement pour qu'on soit bien à l'aise avec les pointeurs...

                Une idée ?
                • Partager sur Facebook
                • Partager sur Twitter
                  1 janvier 2008 à 13:59:42

                  (Je ne suis pas un débuggueur C, c'est bien pour cela que je préfère le C++ => je peux donc me tromper)

                  Le passage des arguments en C (si, si. ton code, c'est du C malgré les new/delete) se fait par valeur.
                  -> *** ou **& pour le passage de VEC vu que c'est un tableau bidimensionnel et que tu veux le modifier.
                  • 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.
                    1 janvier 2008 à 15:35:32

                    Citation : lmghs

                    (Je ne suis pas un débuggueur C, c'est bien pour cela que je préfère le C++ => je peux donc me tromper)

                    Le passage des arguments en C (si, si. ton code, c'est du C malgré les new/delete) se fait par valeur.
                    -> *** ou **& pour le passage de VEC vu que c'est un tableau bidimensionnel et que tu veux le modifier.



                    On est censé aprendre le C++... :euh:

                    Pour ce que tu m'a conseillé, j'ai pas trop compris... tu me demande de faire un pointeur sur un pointeur de pointeur (***) ??
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      1 janvier 2008 à 16:50:30

                      OUi, c'est ce qu'il propose.
                      Mais pour éviter ceci, on dispose aussi de la référence sur le pointeur niveau 2.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        1 janvier 2008 à 16:59:02

                        J'ai mis le tout dans la fonction main pour eviter ce genre de probleme mais toujours le meme probleme...

                        1. #include <iostream>
                        2. #include <cstring>
                        3. using namespace std;
                        4. int main()
                        5. {
                        6.         char A[50],**VEC,**TMP;
                        7.         int x,menu=1,nombre=0;
                        8.         VEC=new char*[5];
                        9.         while (menu<=5 && menu>=1)
                        10.         {
                        11.                 cin>>menu;
                        12.                 switch (menu)
                        13.                 {
                        14.                 case 1:cin>>A;
                        15.                         if (nombre%5==0 && nombre!=0)
                        16.                         {
                        17.                                 TMP=new char*[nombre+5];
                        18.                                 for (int i=0;i<nombre;i++)
                        19.                                         *(TMP+i)=*(VEC+i);
                        20.                                 delete[] VEC;
                        21.                                 VEC=TMP;
                        22.                         }
                        23.                         *VEC=new char[strlen(A)+1];
                        24.                         strcpy(*(VEC+nombre),A);
                        25.                         nombre++;
                        26.                         for (int i=0;i<nombre;i++)
                        27.                                 cout<<*(VEC+i);
                        28.                         break;
                        29.                 case 2://delete_string(VEC,nombre);
                        30.                         break;
                        31.                 case 3://search(VEC,nombre);
                        32.                         break;
                        33.                 case 4://print_spec(VEC,nombre);
                        34.                         break;
                        35.                 case 5://print_all(VEC,nombre);
                        36.                         break;
                        37.                 default:return 0;
                        38.                 }
                        39.         }
                        40.         return 0;
                        41. }
                        • Partager sur Facebook
                        • Partager sur Twitter
                          1 janvier 2008 à 17:11:29

                          Le code proposé compile et fonctionne sans problème. Ou est l'erreur ?

                          Je ferais cependant quelques remarques:
                          1) Pour quoi <cstring> en C++ ?
                          2) Code très mal indenté
                          3) Commentaires ?
                          4) while(1) = mauvaise prog
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                            1 janvier 2008 à 17:21:59

                            J'ai modifié l'indentation et changé la boucle qui te posait probleme :p

                            mais j'ai par contre la meme erreur a l'execution. Lorsque je choisit 1 pour menu et entre une chaine de caractere quelquonque j'ai une erreur:
                            Unhandled exception at 0x6162f0ec in exercice.exe: 0xC0000005: Access violation reading location 0xcdcdcdcd.

                            Pour cstring, c'est bien le header pour le c++...
                            • Partager sur Facebook
                            • Partager sur Twitter
                              1 janvier 2008 à 17:39:56

                              Chez moi, il ne se passe rien du tout quoi que je fasse. On reste dans la boucle infinie et rien ne se passe.

                              cstring, pour utiliser des fonctions C en C++, pourquoi ne èas utiliser le C++ dans ce cas ?

                              Essaye d'utiliser un débuggueur ou de demander sur le forum C pour les questions C.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                1 janvier 2008 à 17:44:29

                                Citation : Nanoc

                                Chez moi, il ne se passe rien du tout quoi que je fasse. On reste dans la boucle infinie et rien ne se passe.

                                cstring, pour utiliser des fonctions C en C++, pourquoi ne èas utiliser le C++ dans ce cas ?

                                Essaye d'utiliser un débuggueur ou de demander sur le forum C pour les questions C.



                                Je ne comprend pas pk la boucle est infinie... En tout cas chez moi, quand je choisit menu 1 ben je doit entrer une chaine de caractere et une fois entree ca bug...
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  1 janvier 2008 à 18:23:13

                                  FAQ C++ de developpez -> #cin_verify
                                  • 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.
                                    2 janvier 2008 à 12:30:32

                                    Probleme resolu. Merci beaucoup ;)
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Pointeurs de pointeurs sur Char... :s

                                    × 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