Il me dit: vector subscript out of range!!!

Résolu
cs_diabohit Messages postés 75 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 2 février 2012 - 14 janv. 2010 à 01:57
cs_diabohit Messages postés 75 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 2 février 2012 - 15 janv. 2010 à 00:30
mon code plante (debug assertion failed)
bon c'est ma méthode (generer_tout_ligne): le problème vient du code en rouge:

***********************************************************************
void generer_tout_ligne() {
srand(int(time(0)));
for (int ii = 2; ii < 15; ii++) {
int nombre = 0;
verif.clear();
for (int g = 0; g < 14; g++) {
verif.push_back(g + 1);
}
for (unsigned int g = 0; g < verif.size(); g++) {
if (verif[g] == ii)
verif.erase(verif.begin() + g);
}
verif2.clear();
for (unsigned int g = 0; g < verif.size(); g++) {
verif2.push_back(verif[g]);
}
for (int i = 1; i < 14; i++) {
if (calendrier[i][ii] == 0) {
for (int g = 1; g < 15; g++) {
for (unsigned int a = 0; a < verif2.size(); a++) {
if (verif2[a] == calendrier[i][g])
verif2.erase(verif2.begin() + a);
}
}
nombre = (int) (0 + ((float) rand() / RAND_MAX * (verif2.size() - 1)));

calendrier[i][ii] = verif2[nombre];
int b = verif2[nombre];
for (unsigned int g = 0; g < verif.size(); g++) {
if (verif[g] == b)
verif.erase(verif.begin() + g);
}
}
}
int remplir;
for (int i = 1; i < 14; i++) {
remplir = calendrier[i][ii];
if (calendrier[i][remplir] == 0)
calendrier[i][remplir] = ii;
}
}
}
***********************************************************************

SVP aidez moi c'est pour mon mini-projet; SVP

30 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
14 janv. 2010 à 20:57
Plusieurs remarques:
- Evite les variables globales
- Utilise des iterateurs quand tu manies la STL, plutôt que des boucle avec des entiers
- srand ne devrait pas être dans la fonction, mais une seule et unique fois dans le programme, généralement au début du main.
- Lorsque tu supprimes un élément, assures-toi de récupérer l'itérateur qui est retourné par la fonction "erase". Cet itérateur te permet de retomber sur tes pieds et de faire pointer ton indice courant à la bonne position. L'itérateur retourné par end(), est garanti de pointer sur la fin, inutile donc de le laisser donc la boucle, il n'a pas besoin d'être recalculé.

Voici un exemple fonctionnel de suppression dans un vecteur, alors que l'on itère dessus:
#include 
#include <vector>

typedef std::vector::iterator iter;
typedef std::vector::const_iterator citer;

void display(const std::vector& tab)
{
  const citer end = tab.end();
  for (citer it = tab.begin(); it != end; ++it)
    std::cout << *it << " ";
  std::cout << std::endl;
}

int main()
{
  std::vector vec;

  for (int g = 1; g <= 14; ++g)
    vec.push_back(g);

  display(vec);

  const iter end = vec.end();
  for (iter it = vec.begin(); it != end; ++it)
    if (*it 10 || *it 8)
      it = vec.erase(it);

  display(vec);

  return 0;
}


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
15 janv. 2010 à 00:21
Le bug semble venir de la ligne:

nombre = (int) (0 +((float) rand() / RAND_MAX * (verif2.size() - 1)));
calendrier[i][ii] = verif2[nombre]; <-- ICI


En effet, à un moment donné, verif2.size() vaut 0, et est donc vide.
Donc d'une part, ça fausse le calcul de "nombre" puisque verif2.size() - 1 devient incorrect (0 - 1 = -1), et en plus tu essaies d'aller à un indice incorrecte (un tableau vide n'a aucun index d'accessible, logique :p).

Je ne sais pas comment corriger cela, vu que je ne sais pas ce que le programme est censé faire. En revanche, je t'invite à vérifier cela, en testant les bornes par exemples, ou en vérifiant que ton raisonnement est correcte.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
3
cs_diabohit Messages postés 75 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 2 février 2012 1
14 janv. 2010 à 01:58
SVP dès que possible repondez moi, je vous remercie d'avance
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
14 janv. 2010 à 09:42
salut,

tu sais, on dors la nuit !

ton erreur est simple.
Imaginons : verif2 = 50 éléments
donc verif2.size() = 50

dans ton for tu fais erase, disons 10 fois; verif2.size() n'est pas réactualisé, ton au 41e éléments, tu débordes !! la boucle for va aller jusqu'à 50.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
14 janv. 2010 à 21:06
Mon exemple de suppression ne fonctionne pas dans tout les cas.
Au temps pour moi, je n'avais pas fait attention au cas particuliers (suppression du dernier élément par exemple).

Voici un petit correctif:
  for (iter it = vec.begin(); it != vec.end();)
    if (*it 12 || *it 14)
      it = vec.erase(it);
    else
      ++it;


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
cs_diabohit Messages postés 75 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 2 février 2012 1
14 janv. 2010 à 21:33
merci de me répondre; chui vraiment reconnaissant.

j'ai besoin qu'il me fais un "erase" à chaque fois, pour que ma logique soit correcte.
est ce que c'est impossible d'avoir actualisé le verif2.size()?????
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
14 janv. 2010 à 22:29
Ce n'est pas le .size() qui pose problème, mais le fait que l'un de tes indices de boucle devient erroné. Fregolo s'est trompé, verif2.size() est bien mis à jour (le compilo ne fait pas d'optim la dessus, raison pour laquelle il faut sortir ce genre de test de la boucle pour ne pas recalculer tout le temps la même chose).

Peux-tu vérifier ce qui provoque un débordement ? Pour cela simplifie la zone que tu as mise en rouge, et fait la fonctionner dans un petit programme à part, afin que l'on puisse t'aider à le debugger.
(Ce n'est pas peut être pas verif qui déborde, mais ton tableau "calendrier").

D'une manière générale, utilise les itérateurs. Tu peux récupérer à chaque tour la mise à jour de l'indice.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
cs_diabohit Messages postés 75 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 2 février 2012 1
14 janv. 2010 à 22:36
ok @CptPingu ;

j'ai mis à la place de

for (unsigned int a = 0; a < verif2.size(); a++) {
....
}

for (unsigned int a = 0; a < verif2.size() - 1; a++) {
....
}


Et ça marche; mais ma logique est fausse là;

ça veut dire quoi???
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
14 janv. 2010 à 22:41
Pour t'aider j'ai besoin de ceci:
Peux-tu vérifier ce qui provoque un débordement ? Pour cela simplifie la zone que tu as mise en rouge, et fait la fonctionner dans un petit programme à part, afin que l'on puisse t'aider à le debugger.
(Ce n'est pas peut être pas verif qui déborde, mais ton tableau "calendrier").


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
cs_diabohit Messages postés 75 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 2 février 2012 1
14 janv. 2010 à 22:44
pour ce code: il me genère une erreur lors du "debug" (vector iterators incompatible)

#include 
#include <vector>

typedef std::vector::iterator iter;
typedef std::vector::const_iterator citer;

void display(const std::vector& tab)
{
  const citer end = tab.end();
  for (citer it = tab.begin(); it != end; ++it)
    std::cout << *it << " ";
  std::cout << std::endl;
}

int main()
{
  std::vector vec;

  for (int g = 1; g <= 14; ++g)
    vec.push_back(g);

  display(vec);

  const iter end = vec.end();
  for (iter it = vec.begin(); it != end; ++it)
    if (*it 10 || *it 8)
      it = vec.erase(it);

  display(vec);

  return 0;
}
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
14 janv. 2010 à 22:46
1) Je t'ai posté un correctif, applique le.
2) Quel compilo utilises-tu ?

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
cs_diabohit Messages postés 75 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 2 février 2012 1
14 janv. 2010 à 22:50
ok j vais faire, 1 min stp
0
cs_diabohit Messages postés 75 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 2 février 2012 1
14 janv. 2010 à 22:51
j'utilise Visual Studio
0
cs_diabohit Messages postés 75 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 2 février 2012 1
14 janv. 2010 à 22:58
j'ai simplifié la zone que j'ai mis en rouge, et ça fonctionne.
0
cs_diabohit Messages postés 75 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 2 février 2012 1
14 janv. 2010 à 23:01
tu sais? lool j dois donner mon application fonctionnelle à mon encadreur demain, l'après midi. il me reste seulement cette faille snif snif...
c'est bizarre! je suis entrain de résoudre ce problème depuis avant hier! SVP trouvez moi une solution, je serai très très reconnaissant...
0
cs_diabohit Messages postés 75 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 2 février 2012 1
14 janv. 2010 à 23:06
pour ce code: il me genère une erreur lors du "debug" (vector iterators incompatible)

#include 
#include <vector>

typedef std::vector::iterator iter;
typedef std::vector::const_iterator citer;

void display(const std::vector& tab)
{
  const citer end = tab.end();
  for (citer it = tab.begin(); it != end; ++it)
    std::cout << *it << " ";
  std::cout << std::endl;
}

int main()
{
  std::vector vec;

  for (int g = 1; g <= 14; ++g)
    vec.push_back(g);

  display(vec);

  const iter end = vec.end();
  for (iter it = vec.begin(); it != end; ++it)
    if (*it 10 || *it 8)
      it = vec.erase(it);

  display(vec);

  return 0;
}
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
14 janv. 2010 à 23:10
Ligne de l'erreur ? Je pense à un truc que le compilo de microsoft gère mal.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
cs_diabohit Messages postés 75 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 2 février 2012 1
14 janv. 2010 à 23:12
@CptPingu, etes vous là?

j'ai modifié quelque chose dans votre code, et ça fonctionne maintenant. je vais l'appliquer dans mon code, et je vous met au courant si t'es encore disponible. ok?
0
cs_diabohit Messages postés 75 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 2 février 2012 1
14 janv. 2010 à 23:14
c'est la "const citer end = tab.end();"

j'ai modifié cette ligne:

for (iter it = vec.begin(); it != end; ++it)

Par:

for (iter it = vec.begin(); it != vec.end(); ++it
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
14 janv. 2010 à 23:22
Il suffit de virer le const devant "citer".
MSVC doit mal gérer la conversion implicite const vers non const.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
Rejoignez-nous