Vector : problème

Signaler
Messages postés
278
Date d'inscription
mardi 22 janvier 2002
Statut
Membre
Dernière intervention
29 août 2006
-
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
-
Bonjour,
voilà, j'ai un problème avec de vector, voilà en gros comment je marche:

J'ai 2 vectors : un de sommets, un autre d'arrete (de segment)
je parcours le vecteur d'arrete, si j'ai 2 segments qui se coupent, je supprime ces 2 Arretes et j'en crée 4 grâce au point d'intersection des 2 précédents.
Pour les rajouter, je fais comme ça:
ARRETE * N_A1 = new ARRETE(S, _A1->getP1());
ARRETE * N_A2 = new ARRETE(S, _A1->getP2());
ARRETE * N_A3 = new ARRETE(S, _A2->getP1());
ARRETE * N_A4 = new ARRETE(S, _A2->getP2());
L_A.erase(L_A.end() - (size + (i - 1)));
L_A.erase(L_A.end() - (size + (i - 1)));
L_S.resize(L_S.capacity() + 1);
L_A.resize(L_A.capacity() + 2);
L_A.push_back(N_A1);
L_A.push_back(N_A2);
L_A.push_back(N_A3);
L_A.push_back(N_A4);
L_S.push_back(S);

apparemment, ça marche bien, les resize() se font nikel.
Mais quand j'arrive sur le L_A.push_back(N_A1); ça plante, erreur mémoire.

Quelqu'un aurait-il une explication?

Merci!

7 réponses

Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
t'es sur de ce que tu fais en faisant

L_A.resize(L_A.capacity() + 2); ?

tu multiplie par 2 la taille du buffer, si tu fais ca dans un boucle tu fera craquer ta memoire en quelques itérations

a mon avis tu veux plutot faire

L_S.resize(L_S.size() + 1);
L_A.resize(L_A.size() + 2);
Messages postés
278
Date d'inscription
mardi 22 janvier 2002
Statut
Membre
Dernière intervention
29 août 2006

bah G essayé avec size(), ça me donne la meme erreur.
Et je vois pas pkoi je ferais péter ma mémoire avec capacity(), au lieu de retourner le nombre d'éléments avec size(), il me retourne le nombre total d'éléments que je peux mettre.

Et ça la fait pas exploser puisque C au premier passage dans ce code que ça plante.
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
si c'est dans une boucle qui fais plus de 20 itérations t'auras deja un buffer 1M de fois plus gros (et 1Mrd avec 30)

ca te sers a quoi de redimensionner sur la capacité? apres quand tu fais un push_back tes données seront plus contigues
Messages postés
278
Date d'inscription
mardi 22 janvier 2002
Statut
Membre
Dernière intervention
29 août 2006

bah ça me sert que quand je fais mon erase(), ça me libère 2 éléments dans mon vector, don j'ai pas de problème pour rajouter 2 nouveaux élémentns, mais dèe que je dois en rajouter 1 un nouveau (donc à partir du 3ème G un debug assertion failed (précédé par un "user breakpoint called") sous Visual.
Donc je pensais que j'avais un problème avec mon vector qui voulait plus me gérer de dépassement sur mon vector. Mais apparemment C pas ça.
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
c'est le 3e ou le 1er qui plante ?

et pour les histoires de taille et capacité pour vector, essay de voir (dans ta tete) ce que ca fais quand tu fais un resize() en te servant de la capacité

ca fais un vecteur troué, et tu sais meme pas ou se trouve tes données

donc je te conseille (mais si c'est pas la ton probleme) de rester avec

// redimensionne
L_S.resize(L_S.size() + 1);
L_A.resize(L_A.size() + 2);

tu sais ce que tu fais ? tu veux faire quoi précisement ? (algo qui concerne le vector)
Messages postés
278
Date d'inscription
mardi 22 janvier 2002
Statut
Membre
Dernière intervention
29 août 2006

si je fais le resize(), C le premier, si je le fais pas, C le 3eme
en gros, l'algo de gestion de mes vectors C ça:

Si Se_coupent(v_segment[i], v_segment[j])
nouveau segment 1;
nouveau segment 2;
nouveau segment 3;
nouveau segemnt 4;
//On considère que les 4 sont issus de la section du point d'intersection des 2 qu'on vérifie
v_segment.effacer(v_segment[i]);
v_segment.effacer(v_segment[j]);
v_segment.ajouter(1);
v_segment.ajouter(2);
v_segment.ajouter(3);
v_segment.ajouter(4);
FinSi

Voilà
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
ok tu en crée 4

pour effacer quelque soit les indices i et j, fais plutot (si i<j)

v_segment.erase( v_segment.begin() + j );
v_segment.erase( v_segment.begin() + i );

et apres tu push_back, pourquoi tu voudrais faire un resize() ?

la seule chose à voir c'est le choix du conteneur, vector c'est pas ce qu'il y a de mieux pour faire des erase (dans ton cas tu pourrais faire une copie à la place des erase)