IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Problème avec vector de vector


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut Problème avec vector de vector
    Bonjour,

    Je suis actuellement sur un projet où j'utilise pas mal les vector.
    Mon but final étant de remplir ce vector :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<vector<string>> stringVector;
    Pour cela, j'ai rempli au préalable un vector temporaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<string> tempVect;
    Puis je met la ligne suivante dont la syntaxe est correct il me semble :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stringVector.push_back(tempVect);
    Pour vérifier que tout est bien rempli, j'affiche le contenu de stringVector :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (int k=0; k <stringVector.size(); k++) // j'ai essayer de remplacé stringVector.size();  par 3 par exemple mais j'ai la même erreur
    {	
    	for (int s=0 ;s <stringVector[k].size(); s++)
    	{
    		cout << stringVector[k][s] << endl;
     
    	}
    	getchar();
    }
    Et là c'est le drame... Mon programme compile bien mais lors de l'éxecution, il rame pendant 15 bonnes secondes puis une fenêtre d'affiche avec le message "Votre application a rencontré un problème et doit être fermé." Puis une autre fenêtre avec "Debug Error - R6010 : abort() has been called"

    Je me suis demandé si cette erreur ne pouvait pas venir de la taille de mon vector. En effet, tempVect contient environ 240 éléments et stringVector 2500 éléments de tempVect ce qui donne une taille considérable.
    Merci de me dire si mon code est correct, l'erreur peut aussi venir de là. Mais sinon est-ce possible que ce soit la taille de mes vectors qui pose problème ?

    Je vous remercie d'avance pour vos réponses

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    D'ici je ne vois rien qui puisse causer d'erreur, surtout à l'affichage.
    Es-tu absolument certain que ton programme crashe bien lors de l'affichage et non lors du remplissage?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Je pense que le problème vient de la ligne de remplissage en effet. Parce que le code de l'affichage me semble correct.
    J'ai afficher le contenu de tempVect et il est correct. Mais dès que je l'insère dans stringVector, ça plante.
    Qu'est ce qui pourrait causer problème lors du remplissage ? La trop grande quantité de données ?

    Merci de ta réponse

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Un trop gros volume causerait une exception std::bad_alloc().
    Tu peux essayer de voir avec un try/catch si une telle exception est levée.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Je me dis que peut-être le problème vient de la structure de mon code en général, je vais essayer de vous le détailler le plus simplement possible.
    En fait, j'analyse un fichier texte, je le parcours ligne par ligne, et pour chaque ligne je stocke des données dans tempVect :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(fichier)  // si l'ouverture a réussi
    {
    	while( !fichier.eof() ) // Tant que nous ne sommes pas à la fin du fichier
                {
                      ... // Je ne détaille pas tout
                      tempVect.push_back(mesDonnees); // Je remplis mon tempVect
                      stringVect.push_back(tempVect); // je remplis mon vector de vector à cet endroit
                }
    }
    Pour chaque ligne, tempVect est donc différent car il récupère des données de la ligne courante (mesDonnes est un string).
    Peutêtre ai-je mal placé le remplissage de stringVect ?
    Il doit se remplir pour chaque nouveau tempVect.
    Je ne comprends vraiment pas mon erreur. Mon parcourt de fichier marche car j'ai rempli pas mal de conteneur pour stocker mes données.

    Merci d'avance pour vos réponses

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    En effet, j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try
    {
    	stringVect.push_back(tempVect);;
    }
    catch (std::bad_alloc& ba)
    {
    	std::cerr << "bad_alloc caught: " << ba.what() << '\n';
    	getchar();
    }
    Et le programme me renvoi bien l'exception... Y a t-il une solution pour remédier à ce problème ? (A part diminuer le nombre de données ce qui est bien sûr impossible pour ma part)

    Merci de votre réponse

  7. #7
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    240 * 2500, ça donne 600*000 éléments.

    En supposant que tes chaînes fassent une vingtaine de caractères de long, ça nous donne du 12 Mo d’occupation mémoire. Bref, j’ai envie de dire peanuts, sauf si tu es en environnement contraint.

    Si elles sont 10 fois plus longues, ça devrait encore passer sur n’importe quelle machine moderne.

    En revanche, deux remarques :
    - il est beaucoup plus efficace de rajouter le tempvect à stringvect en début de traitement, puis de remplir stringVect.back() que de passer par tempvect.*Ça t’évitera une recopie complète du vecteur.
    - si tes données sont vraiment trop grosses et ne tiennent pas en mémoire, il te faudra faire le traitement au fur et à mesure que tu lis. Pas le choix.

  8. #8
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Merci de tes conseils. Je vais essayer de trouver une solution.
    - Je ne sais pas si on peut appeler ça un "environnement contraint" mais je suis en stage sur un PC de l'entreprise et non sur ma propre machine. Je ne peux donc pas faire ce que je veux ^^
    - De plus je suis sur un PC XP 64bits, je ne sais pas si c'est considéré comme une machine moderne ^^
    - Je remplis mon tempVect avec des chaînes de au plus 7 caractères, c'est quand même bizarre que ça ne passe pas du coup...

    Merci beaucoup de ta réponse, je vais essayer de régler mon problème !

  9. #9
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Citation Envoyé par maud4274 Voir le message
    Merci de tes conseils. Je vais essayer de trouver une solution.
    - Je ne sais pas si on peut appeler ça un "environnement contraint" mais je suis en stage sur un PC de l'entreprise et non sur ma propre machine. Je ne peux donc pas faire ce que je veux ^^
    - De plus je suis sur un PC XP 64bits, je ne sais pas si c'est considéré comme une machine moderne ^^
    - Je remplis mon tempVect avec des chaînes de au plus 7 caractères, c'est quand même bizarre que ça ne passe pas du coup...

    Merci beaucoup de ta réponse, je vais essayer de régler mon problème !
    Environnement contraint, c’est une RAM qui se compte en ko, éventuellement en unité de Mo. Donc non, tu es en environnement standard .

    Vraisemblablement, vu la taille de tes données, il y a soit un leak, soit une énorme duplication de données. Je pense, lors de la lecture du fichier, puisque le code que tu montres n’est pas incorrect.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ogre] Problème avec un conteneur vector
    Par Invité dans le forum C++
    Réponses: 6
    Dernier message: 05/11/2011, 23h49
  2. Réponses: 3
    Dernier message: 03/02/2011, 19h09
  3. Problème avec le conteneur vector
    Par Dolphin Dice dans le forum C++
    Réponses: 10
    Dernier message: 14/01/2011, 00h49
  4. Problème avec la classe Vector.
    Par kaelem dans le forum Langage
    Réponses: 10
    Dernier message: 28/12/2006, 10h19
  5. [gsoap] Problème avec les std::vector
    Par LePhasme dans le forum SL & STL
    Réponses: 1
    Dernier message: 25/04/2006, 12h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo