1_ Je dois faire des tableaux a deux dimensions, mais lorsque je fais ce code:( la taille du tableau est arbitraire)
std::vector < std::vector<char> >wArr0;
wArr0.resize(158);
for(int ligne = 0; ligne < wArr0.size(); ligne++)
{
wArr0[ligne].resize(209);
}
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
wArr0[x][y] = 1
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?
pour ton premier probleme, comment peux tu affirmer que la taille est de 210 et non 209 ? Si tu fais
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
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...
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.
Pour le probleme 1 j'ai trouvé une eventuelle solution :
std::vector < std::vector<char> >wArr0;
wArr0.resize(158);
for(int ligne = 0; ligne < wArr0.size(); ligne++)
{
wArr0[ligne].resize(209-1);
}
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...
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 !
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.
× 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.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html