Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problemes avec les std::vector

probleme de taille et de valeurs

    5 novembre 2007 à 10:37:02

    Bonjour,

    J'ai deux problemes avec les std::vector :

    1_ Je dois faire des tableaux a deux dimensions, mais lorsque je fais ce code:( la taille du tableau est arbitraire)

    1. std::vector < std::vector<char> >wArr0;
    2. wArr0.resize(158);
    3. for(int ligne = 0; ligne < wArr0.size(); ligne++)
    4. {
    5.     wArr0[ligne].resize(209);
    6. }


    Je me retrouve avec un tableau de 158 elements en x (donc taille correcte, de 0 à 157) mais avec 210 elements en y (de 0 à 209, alors que l'indice 209 ne devrait pas exister).
    Quelqu'un à t-il la solution? Merci d'avance

    2_Probleme plus grave: de tant en tant, lorsque j'assigne un valeur a ce tableau, je ne recupere pas cette valeur...
    Dans l'exemple que j'ai donné pour le probleme 1, si on fait
    1. wArr0[x][y] = 1
    2. print("%ld",wArr0[x][y])

    Ca met la bonne valeur sauf pour wArr0[0][0] et quelques autre positions dans le tableau, positions qui changent tout le temps... en generale ca me renvoie une valeur impossible car trop grande pour un char
    Je dois préciser que lorsque que je prend la valeur du tableau je fais un cast : (int)wArr0[x][y]
    Pouvez vous m'aider?

    Merci d'avance.


    ~Darktib
    • Partager sur Facebook
    • Partager sur Twitter
      5 novembre 2007 à 12:56:22

      pour ton premier probleme, comment peux tu affirmer que la taille est de 210 et non 209 ? Si tu fais

      1. int taille = wArr0[0].size();


      Tu devrais avoir 209, et non 210. (je viens de tester), donc le probleme 1 n'existe pas. (ou alors comment as tu fait pour récupérer la taille de ton vector ? (note : tous les conteneurs contiennent, en interne, un éleément interne appelé sentinelle, qui représentent conteneur::end(), cependant, tu n'as pas a t'en occuper) normalement, tu ne devrais pas avoir de problemes)

      Pour ton 2e probleme, il est simple : tu essaies d'écrire un char avec %ld (utilisé pour les données 32 bits). Déja, si tu utilises vector, n'utilise pas printf :)

      1. cout << wArr0[x][y] << endl;


      ça devrait mieux marcher.
      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        5 novembre 2007 à 16:23:58

        Merci pour ta reponse

        En fait ce sont des fonctions dans une dll que j'utilise avec un autre langage, darkbasic pro.Pour le probleme 1 je faisait une boucle for qui allait de 0 a 158 pour les x. ca plantait a 158 donc c'est que les vectors marchaient. Par contre, je faisait une boucle for qui allait de 0 a 209, et ca ne plantait pas...

        Pour le probleme 2 ca me renvoie une valeur enorme pour toutes les cases:

        • toutes les case dont x=0 ( (0,y) renvoie une valeur erronée)
        • toutes les cases dont y=0 ( (x,0) renvoie une valeur erronée)


        Comme c'est une fonction de la dll je ne sais pas a quoi est du le probleme...

        Est ce que les vectors supportent bien l'indice 0 ?

        J'ai retesté la dll, et les valeurs erronnées du prob 2 sont toujours erronnées, meme apres avoir essayé de changer la valeur des cases...

        • Partager sur Facebook
        • Partager sur Twitter
          5 novembre 2007 à 16:45:10

          Si ça n'a pas planté, c'est que wArr0[0][209] est en fait wArr0[1][0] (si j'ai bien compris comment fonctionne la mémoire).
          • Partager sur Facebook
          • Partager sur Twitter
            5 novembre 2007 à 20:59:57

            Citation : bogoss

            Si ça n'a pas planté, c'est que wArr0[0][209] est en fait wArr0[1][0] (si j'ai bien compris comment fonctionne la mémoire).



            Dans le cas d'un tableau statique a double entrée, c'est le cas.
            Mais dans le cas du std::vector<std::vector<truc> > je pense que ça ne doit pas etre tout a fait exact.

            La classe vector contient 3 pointeurs : un vers le début de l'allocation contigue de mémoire, l'autre vers la sentinelle (la fin +1) et un 3e vers l'allocator.

            Du coup, en mémoire, ça ne doit pas etre contigu. Mais bon c'est du détail.
            • Partager sur Facebook
            • Partager sur Twitter

            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

              5 novembre 2007 à 21:43:02

              Pour le probleme 1 j'ai trouvé une eventuelle solution :) :
              1. std::vector < std::vector<char> >wArr0;
              2. wArr0.resize(158);
              3. for(int ligne = 0; ligne < wArr0.size(); ligne++)
              4. {
              5.     wArr0[ligne].resize(209-1);
              6. }

              Il suffit de truquer... ;)
              Je dit 'eventuelle' car la solution dépendra de la solution au probleme 2, qui est beaucoup plus 'grave'.
              En effet, si la dll (qui je code et qui a ces problemes) renvoie nimporte quoi comme valeur ca ne sert plus a rien de l'utiliser...
              • Partager sur Facebook
              • Partager sur Twitter
                7 novembre 2007 à 18:22:31

                Up.

                Si quelqu'un a une solution pour le probleme 2 ce serait sympa.
                J'ai cherché mais je n'ai pas trouvé... :euh:

                Merci
                • Partager sur Facebook
                • Partager sur Twitter
                  7 novembre 2007 à 18:42:44

                  Il faudrait plus de détails.

                  Parce que là tout ce qu'on peut dire c'est que c'est pas normal et que la faute est sûrement ailleurs.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                    7 novembre 2007 à 18:46:13

                    Quoiqu'il en soit, je ne suis pas sur que "truquer" soit la solution.
                    Si tu resize a 210, alors tu as des éléments entre 0 et 209.
                    Si ça plante quand tu essaies d'y accéder, ça veut dire que tu as débordé quelque part, avant, ou alors que tu as cassé quelque chose avant.
                    Si "truquer" pourra éventuellement déplacer le probleme, ton programme reste instable et risque de planter a un moment ou un autre, ou pire, de façon "aléatoire"

                    Sois bien rigoureux, et si tu débordes, il faut corriger :)
                    vector genere des exceptions quand il déborde, essaie de mettre de try catch, pour voir !
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                      7 novembre 2007 à 18:55:11

                      Citation : Fvirtman

                      vector genere des exceptions quand il déborde, essaie de mettre de try catch, pour voir !



                      Seulement lorsque la lecture de la valeur est fait avec at();

                      http://cppreference.com/cppvector/at.html

                      lire une case [0][0] dans une vecteur de vecteurs de caractères ce fait facilement comme ceci:
                      1. char c = v.at( 0 ).at( 0 );
                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 novembre 2007 à 21:52:09

                        @Mattex : je vais essayer, mais je ne connait pas vraiment les exceptions.

                        En fait si je voulait truquer c'etait pour eviter les cases avec un "0" dans les coord.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 novembre 2007 à 18:17:08

                          Up

                          J'ai vraiment besoin de savoir comment on peut faire pour lire une valeur a (0;0) sans valeurs erronées
                          Merci

                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 novembre 2007 à 16:19:56

                            tests ta taille!

                            1. if( v.size() > 0 && v[ 0 ].size() > 0 )
                            2.     valeur = v[ 0 ][ 0 ];


                            n'oublis pas que c'est un vecteur de vecteur... alors c'est un tableau normal contenant size() - 1 fois des tableaux normaux...
                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 novembre 2007 à 18:09:57

                              Merci de ta reponse.
                              Je vais tester.

                              Mais normalement lorsqu'on fait un vecteur de vecteur ca fait bien:

                              Tableau:____0____________1____________2____________3______...____n
                              ________Tableau[0]____Tableau[1]____Tableau[2]____Tableau[3]____Tableau[n]

                              (je met des "_" car les espaces ne sont pas acceptés dans le zcode)

                              Donc normalement il ne devrait pas y avoir des problemes avec la premiere case...(0;0)ou(x;0)ou(0;y) devrait marcher...

                              A moins que ces cases ne supportent pas les cast?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                19 novembre 2007 à 21:03:14

                                Je comprends pas où est ton problème. D'après moi ton erreur est ailleurs.

                                Au pire essaye d'utiliser at() plutôt que [] pour accéder aux éléments et rattrape l'exception qui pourrait être levée en cas de problème d'accés à la mémoire.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                  21 novembre 2007 à 13:45:13

                                  Euh :euh: comment on fait pour 'attraper' les exceptions et les interpreter svp?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Anonyme
                                    21 novembre 2007 à 13:55:20

                                    Fait quelques petites recherches sur try et catch.
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Problemes avec les std::vector

                                    × 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