Il me dit: vector subscript out of range!!! [Résolu]

Messages postés
75
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
2 février 2012
- - Dernière réponse : 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
Afficher la suite 

Votre réponse

20/30 réponses

Meilleure réponse
Messages postés
3832
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
3 avril 2019
163
3
Merci
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]

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 116 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3832
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
3 avril 2019
163
3
Merci
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]

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 116 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
75
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
2 février 2012
0
Merci
SVP dès que possible repondez moi, je vous remercie d'avance
Commenter la réponse de cs_diabohit
Messages postés
1108
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
0
Merci
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.
Commenter la réponse de fregolo52
Messages postés
3832
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
3 avril 2019
163
0
Merci
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]
Commenter la réponse de cptpingu
Messages postés
75
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
2 février 2012
0
Merci
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()?????
Commenter la réponse de cs_diabohit
Messages postés
3832
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
3 avril 2019
163
0
Merci
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]
Commenter la réponse de cptpingu
Messages postés
75
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
2 février 2012
0
Merci
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???
Commenter la réponse de cs_diabohit
Messages postés
3832
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
3 avril 2019
163
0
Merci
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]
Commenter la réponse de cptpingu
Messages postés
75
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
2 février 2012
0
Merci
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;
}
Commenter la réponse de cs_diabohit
Messages postés
3832
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
3 avril 2019
163
0
Merci
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]
Commenter la réponse de cptpingu
Messages postés
75
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
2 février 2012
0
Merci
ok j vais faire, 1 min stp
Commenter la réponse de cs_diabohit
Messages postés
75
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
2 février 2012
0
Merci
j'utilise Visual Studio
Commenter la réponse de cs_diabohit
Messages postés
75
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
2 février 2012
0
Merci
j'ai simplifié la zone que j'ai mis en rouge, et ça fonctionne.
Commenter la réponse de cs_diabohit
Messages postés
75
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
2 février 2012
0
Merci
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...
Commenter la réponse de cs_diabohit
Messages postés
75
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
2 février 2012
0
Merci
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;
}
Commenter la réponse de cs_diabohit
Messages postés
3832
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
3 avril 2019
163
0
Merci
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]
Commenter la réponse de cptpingu
Messages postés
75
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
2 février 2012
0
Merci
@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?
Commenter la réponse de cs_diabohit
Messages postés
75
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
2 février 2012
0
Merci
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
Commenter la réponse de cs_diabohit
Messages postés
3832
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
3 avril 2019
163
0
Merci
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]
Commenter la réponse de cptpingu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.