Partage
  • Partager sur Facebook
  • Partager sur Twitter

Question "struct" et pointeurs

Sujet résolu
    26 juin 2007 à 17:31:57

    Salut, j'essaie de parfaire les maigres connaissances que j'ai en C++ et j'ai (re ?)découvert les pointeurs sur structure, j'ai donc essayé de petit morceau de code :

        struct Client
        {
               int age;
               char nom[5];
               };
               

        Client *pStruct;
       
        pStruct->age=87;
        (*pStruct).nom[0]='P';
       
        cout << pStruct->age << " " << (*pStruct).nom[0];


    En fait à la compilation il ne me signale aucun problème, et à l'exécution il plante (rapport d'erreur bla bla bla). J'ai essayé de n'initialiser que nom[0] parce que rien de ce que j'ai trouvé pour initialiser le tableau en entier n'est passé à la compilation donc si quelqu'un pouvait m'expliquer, ce serai sympa :D Merci :)
    • Partager sur Facebook
    • Partager sur Twitter
      26 juin 2007 à 17:38:39

      Tu n'as pas créé d'objet de type Client, tu as seulement un pointeur sur un objet de type Client. Pour que ton code soit exacte, il faut que tu alloues toi-même la mémoire :

      struct Client
      {
          int age;
          char nom[5];
      };

      Client *pStruct = new Client;
      // manipulation de ton pointeur ici

      delete pStruct; // on n'oublie pas de libérer la mémoire
      • Partager sur Facebook
      • Partager sur Twitter
        26 juin 2007 à 17:42:25

        Ah oui ça marche merci ^^
        Une dernière question, comment initialiser le tableau en entier ? Je ne suis quand même pas obligé de le faire élément par élément ?
        • Partager sur Facebook
        • Partager sur Twitter
          26 juin 2007 à 18:30:57

          envoie l'adresse de ton tableau dans une fonction qui initialisera le(s) tableau(x)
          • Partager sur Facebook
          • Partager sur Twitter
            26 juin 2007 à 19:07:40

            nom est un pointeur qui pointe sur nom[0], donc pStruct est un pointeur sur pointeur, c'est ça ? Donc dans ma fonction, il faut que le paramètre soit du type "Client *tableau", qui lors de l'appel sera remplacé par "pStruct->nom", non ? Donc l'adresse du tableau m'est visiblement donnée (après les tests que j'ai pu faire) par &pStruct->nom, qui correspond à nom[0] (je me suis pas planté jusque là ?). Mais je vois pas comment envoyer ça à une fonction (je sais pas quel type lui donner en fait, c'est sûrement très bête mais je commence à fatiguer et à m'énerver ^^) et comment le modifier (à la limite ça je pourrai peut-être me débrouiller) :(
            • Partager sur Facebook
            • Partager sur Twitter
              26 juin 2007 à 22:27:28

              struct Client {
                  int age;
                  std::string nom;
                  Client(int p_age, std::string const& p_nom) : age(p_age),nom(p_nom){}
              };

              Client * c = new Client(42, "toto le grand");

              C'est bien aussi vu que tu fais du C++.

              Par contre, avec le constructeur, on perd la possibilité d'utiliser les initialisations directes (j'ai oublié le nom officiel) que l'on aurait sinon avec les données sur la pile:
              Client c = { 42, "toto" }; // plus possible
              • 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.
                27 juin 2007 à 4:57:30

                Citation : lmghs


                Par contre, avec le constructeur, on perd la possibilité d'utiliser les initialisations directes (j'ai oublié le nom officiel) que l'on aurait sinon avec les données sur la pile:

                Client c = { 42, "toto" }; // plus possible


                Mais ce n'est pas trop grave, parce que l'on peut appeler le constructeur à la déclaration de l'instance sur la pile, c'est même obligatoire, sauf si on a un constructeur sans paramètres, auquel cas il sera appelé automatiquement.


                Client c(42,"toto");

                • 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
                  27 juin 2007 à 10:03:55

                  C'est surtout pour déclarer des tableaux que l'on perd cette écriture -> { {41, "titi"}, {42,"toto"} }

                  PS: je n'ai pas suivi ce que tu voulais dire avec au sujet du constructeur par défaut (sans arguments)
                  • 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.
                    27 juin 2007 à 14:35:56

                    Oui mais j'utilise une structure, pas une classe, donc l'appel du constructeur est impossible.
                    Bon évidemment ça simplifierait pas mal de choses, mais j'aimerai bien savoir comment faire avec la structure. Je vous donne le code que j'ai pour l'instant (qui fonctionne à la compilation mais s'exécute n'importe comment) :

                    main.cpp

                    #include <iostream>
                    #include <stdio.h>

                    #include "client.h"

                    using namespace std;

                    void tableauStruct(const char tableau[]);
                       
                    int main()
                    { 
                        Client *pStruct = new Client;
                       
                        pStruct->age=87;
                       
                        tableauStruct(pStruct->nom);
                       
                        cout << pStruct->age << " " << pStruct->nom;
                       
                        delete pStruct;
                       
                        system("PAUSE");
                       
                        return EXIT_SUCCESS;
                       
                               }
                               
                    void tableauStruct(const char tableau[])
                    {
                     tableau="abcde";
                     cout << tableau;
                    }


                    client.h :

                    struct Client
                    {
                         int age;
                         const char nom[5];
                         };


                    Voilà donc j'essaie de faire passer pStruct->nom dans la fonction tableauStruct, afin de pouvoir modifier directement, à la compilation je n'ai aucune erreur signalée, mais lors de l'exécution, il m'affiche

                    "87 ' Appuyez sur une touche pour continuer" le " ' " correspondant à l'affichage de pStruct->nom o_O

                    Merci de votre aide :D
                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 juin 2007 à 14:50:15

                      tableau="abcde";


                      Depuis quand on remplit un tableau comme ça ?!

                      Je ferais ceci (pas testé, mais avec la table des caractères je pense que cela devrait remplir avec "abcd") :

                      for(int i = 0 ; i < 4 ; i++) tableau[i] = 'a' + i;
                      tableau[4] = '\0'; // on n'oublie pas le '\0' final


                      Sinon pour ta structure, c'est comme une classe où tout est public par défaut. Tu as donc aussi un constructeur et un destructeur ;)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 juin 2007 à 15:13:10

                        Citation : Elrond

                        Sinon pour ta structure, c'est comme une classe où tout est public par défaut. Tu as donc aussi un constructeur et un destructeur ;)



                        Ah ça je savais pas ! Merci ^^
                        Bon ben ça marche nickel avec le constructeur alors, par contre pourquoi faire passer une référence ? (j'ai encore un peu de mal à jongler entre pointeurs et références :euh: )

                        Merci à tous pour votre aide ;)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          27 juin 2007 à 19:30:44

                          Citation : lmghs

                          C'est surtout pour déclarer des tableaux que l'on perd cette écriture -> { {41, "titi"}, {42,"toto"} }

                          PS: je n'ai pas suivi ce que tu voulais dire avec au sujet du constructeur par défaut (sans arguments)



                          Je faisais simplement référence au fait que lorsqu'il n'y a pas de liste d'arguments au constructeur, on ne met pas de liste d'arguments vide à la déclaration de l'instance.



                          struct toto
                          {
                             toto();
                             toto(int param);
                          }


                          toto t; // Constructeur par défaut (sans arguments)
                          toto t1(5); // Constructeur avec arguments


                          • 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

                          Question "struct" et pointeurs

                          × 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