Partage
  • Partager sur Facebook
  • Partager sur Twitter

struct & pointeur fonction

    1 avril 2008 à 21:26:02

    Bonjour ,
    J'ai un petit problème d'enregistrement dans une structure perso à partir d'une fonction.
    Le problème c'est que je n'arrive pas à enregistrer toutes les données dans le tableau de la structure !!!
    Voici le code simplifié pour que vous puissiez m'aider le plus vide et bien possible !!!!

    1. #include <iostream>
    2. struct Place
    3. {
    4.     std::string nom;
    5.     int X;
    6.     int Y;
    7. };
    8. void placePerso(Place *place)
    9. {
    10.     int X, Y;
    11.     std::string tmp, nom;
    12.     for(int j=0;j<10;j++)
    13.     {
    14.         std::cin >> nom ;
    15.         std::cin >> X ;
    16.         std::cin >> Y ;
    17.         place[j].nom = nom;
    18.         place[j].X = X;
    19.         place[j].Y = Y;
    20.         //ici je n'arrive pas à rentrer les données dans le tableau de la structure place
    21.         // comment faire ??? sachant que c'est un tableau ???
    22.     }
    23. }
    24. int main()
    25. {
    26.     Place place[10];
    27.     placePerso(&place[10]);
    28.     for(int i=0;i<10;i++)
    29.     {
    30.         std::cout << place[i].nom << "\n";
    31.         std::cout << place[i].X << "\n";
    32.         std::cout << place[i].Y << "\n";
    33.         std::cout << "\n";
    34.     }
    35.     return EXIT_SUCCESS;
    36. }


    en espérant que ce soit possible
    bougaloo
    • Partager sur Facebook
    • Partager sur Twitter
      1 avril 2008 à 21:29:09

      Pourquoi ne pas utiliser un std::vector<>, c'est tellement plus simple.

      Pourquoi est-ce que tu passes &places[10] à la fonction et pas "place" tout simplement ?

      Ta boucle doit aller de i=0 à i<10 et pas 11.
      Ensuite tu fais place[i].nom = blabla...
      place[i].X = ...
      • Partager sur Facebook
      • Partager sur Twitter
      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
        1 avril 2008 à 21:41:08

        je viens de modifier un peu le code et après quelques petites corrections , le programme plante pendant son exécution au bout de la troisième entrée de nom !!!
        pourquoi je ne sais pas !!!
        quelqu'un aurait une idée ???
        • Partager sur Facebook
        • Partager sur Twitter
          1 avril 2008 à 21:42:39

          Pour les raisons que j'ai évoqué au-dessus (sans le vector).
          • Partager sur Facebook
          • Partager sur Twitter
          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
            1 avril 2008 à 22:26:13

            Et bien maintenant en suivant ton conseil de ne mettre que : placePerso(place); lors de l'appel de la fonction , l'entrée des données fonctionne bien , mais de retour dans la fonction main principale , les données ne sont pas renvoyé dans celle-ci et donc çà ne sert à rien !!!
            Moi j'aimerais modifier mon tableau de structure dans une fonction extérieur au main , tout en conservant les valeurs données !!!
            Une solution ???
            • Partager sur Facebook
            • Partager sur Twitter
              1 avril 2008 à 22:38:38

              1. std::istream operator>>(std::istream &is, Place & p) {
              2.     return is >> p.X >> p.y >> p.nom;
              3. }
              4. void readN(Place * places, int N) {
              5.     for (int i=0 ; i<N ; ++i)
              6.     {  if (!(is>>places[i]))
              7.            return i;
              8.     }
              9.     return N;
              10. }
              11. ...
              12. readN(&places[0], 10);

              Un vecteur reste 100 fois plus propre, sûr et robuste.
              • 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 avril 2008 à 9:22:21

                et bien je ne connas pas les vecteur
                mais en ayant mis ton code d'aide çà me fais une erreur dans le fichier ios_base.h avec environ 20 erreur dans celui ci !!!
                donc ... solution ???
                merci encore malgrés que je ne suis toujours pas avancé dans mon probléme !!
                • Partager sur Facebook
                • Partager sur Twitter
                  2 avril 2008 à 10:52:34

                  Quelles erreurs ?
                  • 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 avril 2008 à 20:00:57

                    1. #include <iostream>
                    2. struct Place;
                    3. std::istream& operator>>(std::istream &is, Place & p) {
                    4.     return is >> p.X >> p.y >> p.nom;
                    5. }
                    6. int readN(Place * places, int N) {
                    7.     for (int i=0 ; i<N ; ++i)
                    8.     {  if (!(std::cin >> places[i]))
                    9.            return i;
                    10.     }
                    11.     return N;
                    12. }
                    13. int readN(Place * places, int N, std::istream & is) {
                    14.     for (int i=0 ; i<N ; ++i)
                    15.     {  if (!(is >> places[i]))
                    16.            return i;
                    17.     }
                    18.     return N;
                    19. }
                    20. ...
                    21. //Place places[ 10 ];
                    22. readN(places, 10);
                    23. //OU
                    24. readN(places, 10, std::cin );


                    readN retourne un int pas un void

                    operator >> ne devrait-il pas retourner un std::istream& (si mes souvenirs sont bons)

                    is n'est pas défini dans readN, j'ai mis std::cin mais tu peux passer une std::istream& en paramètre aussi comme ça ta fonction peux lire de n'importe quel istream et ses descendants. (ex. ifstream)

                    &places[ 0 ] == places

                    lmghs a seulement été un peu trop rapide ;)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 avril 2008 à 20:13:24

                      J'ai omis de dire un petit truc !!!
                      J'ai mis des std::cin pour simplifier la chose mais c'est à partir d'une base de donnée que je remplis le tableau de structure , donc pour faire une modification de std::istream operator>> je ne sais comment faire !!!
                      et il n'y a pas une solution plus simple car le problème apparaît uniquement parce que je fais un tableau !!!
                      Enfin ... maintenant j'ai le temps ... pour attendre vos réponses ^^
                      mais j'ai essayé ce que MatteX m'a dit et çà n'a pas l'air de fonctionner !!!
                      Merci beaucoup
                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 avril 2008 à 21:02:45

                        Citation : MatteX

                        a- readN retourne un int pas un void

                        b- operator >> ne devrait-il pas retourner un std::istream& (si mes souvenirs sont bons)

                        c- is n'est pas défini dans readN, j'ai mis std::cin mais tu peux passer une std::istream& en paramètre aussi comme ça ta fonction peux lire de n'importe quel istream et ses descendants. (ex. ifstream)

                        d- &places[ 0 ] == places

                        e- lmghs a seulement été un peu trop rapide ;)


                        a-, b- Si tout à fait

                        c- Bonne évolution

                        d- Et ... non. :p places est un tableau statique ... qui est implicitement converti par le compilo en &place[0]
                        1. void match(int *p) {
                        2.     std::cout << "match pointer\n";
                        3. }
                        4. template <std::size_t N> void match(int (&)[N]) {
                        5.     std::cout << "match array["<<N<<"]\n";
                        6. }
                        7. void match_array() {
                        8.     int t[10];
                        9.     match(t);
                        10.     match(&t[0]);
                        11. }

                        (On peut faire sauter le template, mais cela perd un peu de son intérêt)

                        e- Hé hé :-°


                        Citation : bougaloo

                        J'ai omis de dire un petit truc !!!
                        1- J'ai mis des std::cin pour simplifier la chose mais c'est à partir d'une base de donnée que je remplis le tableau de structure , donc pour faire une modification de std::istream operator>> je ne sais comment faire !!!
                        2- et il n'y a pas une solution plus simple car le problème apparaît uniquement parce que je fais un tableau !!!

                        3- mais j'ai essayé ce que MatteX m'a dit et çà n'a pas l'air de fonctionner !!!


                        1- Passe par un std::istringstream
                        2- quoi ?
                        3- précise (ne serait pas à cause de la déclaration anticipée de Place alors que la définition est nécessaire depuis l'opérateur d'extraction ?)
                        • 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.

                        struct & pointeur fonction

                        × 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