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

C++ Discussion :

Vecteur avec element vide, fait planter l'execution


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    Points : 83
    Points
    83
    Par défaut Vecteur avec element vide, fait planter l'execution
    bon soir,

    Est-ce-que quelqu'un pourrait me confirmer que dans le cas suivant,

    vector<string> st;

    avec 3 element: "jedna","dve",""

    si j'essay de lire la dernier valeur comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<string>::iterator::iter = st.end();
    string tmp = *st;
    alors a la lecture j'ai une erreur??

    Si c'est bien le cas, j'aimerai savoir comment detecter ce cas.


    merci, et bonne soire

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    Bonsoir,

    Je ne vois pas trop ce que tu essaies de faire, surtout avec le "main" après la lecture de la variable, mais ça ne m'étonne pas que ça plante.

    Essaie ça, ça devrait marcher mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string tmp = *(st.end());

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Ca m'étonne que ce code compile car il n'est aucunement valide.
    Le code suivant compile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #include <string>
    #include <iostream>
    #include <vector>
     
     
    int main(int argc, char const *argv[])
    {
        std::vector<std::string> v;
        v.push_back("toto");
        v.push_back("titi");
        v.push_back("tata");
     
        std::cout<<v[v.size()-1]<<std::endl;
        return 0;
    }
    Edit:
    Bonsoir,

    Je ne vois pas trop ce que tu essaies de faire, surtout avec le "main" après la lecture de la variable, mais ça ne m'étonne pas que ça plante.

    Essaie ça, ça devrait marcher mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string tmp = *(st.end());
    Ceci est faux car end() ne pointe JAMAIS sur quelque chose appartenant au vector. Il ne FAUT PAS déférencer end(), sinon boom.

  4. #4
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    Points : 83
    Points
    83
    Par défaut
    merci.

    1] le main() c'est une erreur.

    2) Ca compile tres bien..

    je vais devlopper:
    je lit un fichier, et la derniere ligne est defois vide, d'ou le dernier element
    ne contenant rien.
    Et c'est quand j'essay de lire la valeur contenu dans ce dernier element en
    utilisant string = *iterateur
    que L'EXECUTION plante

    des idees??

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Ca m'étonne que ce code compile car il n'est aucunement valide.
    Le code suivant compile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #include <string>
    #include <iostream>
    #include <vector>
     
     
    int main(int argc, char const *argv[])
    {
        std::vector<std::string> v;
        v.push_back("toto");
        v.push_back("titi");
        v.push_back("tata");
     
        std::cout<<v[v.size()-1]<<std::endl;
        return 0;
    }
    Edit:

    Ceci est faux car end() ne pointe JAMAIS sur quelque chose appartenant au vector. Il ne FAUT PAS déférencer end(), sinon boom.
    Méa culpa!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string tmp = *(st.end()-1);

  6. #6
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    Points : 83
    Points
    83
    Par défaut
    oui, mais en faissan cela, je lit la valeur precedente, c'est ca??

    et moi la valeur precedente je l'ai lue au tour precedent
    (ehh, oui ca veut rien dire, mais on se comprend?)

    moi j'ai une boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    getline(ifstream, string buffer) vectoeur.push_back(buffer);
    //des fonction qui initialise iter et fin
    for(iter;iter!=fin;iter++)
       {
       string temp = *iter;
       if ......
    Il arrive que fin, pointe sur le dernier element du vecteur qui est parcouru par iter, ET il arrive que ce dernier element, soit egalement la derniere ligne vide d'un fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    premiere ligne\n
    seconde ligne\n
    on a dans ce cas un saut a la ligne en fin du fichier, qui est considerai comme une ligne par getline

    Et si ces deux condition son rempli, alors ca rame 4seconde et execution est interompu.
    Je suis bien sur que le plantage survient a la ligne
    .

    hmm??

  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Montre un code complet minimal et compilable avec le fichier approprié qui reproduit le problème.

  8. #8
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    Points : 83
    Points
    83
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    ifstream fileI(chemin, ios_base::in);
    vector<string> fichier;
    getline(ifstream, string buffer) vectoeur.push_back(buffer);
    fileI.close();
     
    vector<string>::iterator iter=fichier.begin();
    vector<string>::iterator fin=fichier.begin();
    // fonction qui initialise iter et fin
    secpos(string, fichier, iter, fin); //(string sec, vector<string> & fichier, iterator & iter, iterator & fin)
    /* cf le fichier, apres l'apele de secpos
    iter pointe sur le premier element
    fin pointe sur la dernier ligne, qui ne contien rien
    */
     
    for(iter;iter!=fin;iter++)
       {
       string temp = *iter;  //la ici plantage quand iter=fichier.end() + cf note
       if (temp.find("=",1)!=string::npos){
             ect
    fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    premiere ligne\n
    seconde ligne\n
    NOTE
    je ne suis pas obligatoirement en fin de fichier, ce n'est que dans ce cas que y'a des problemes. Donc je ne peut faire une verification du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(iter;iter!=fin;iter++)
       {
       if (iter==fichier.end()) //resoud pas le problem
       string temp = *iter;
       if (temp.find("=",1)!=string::npos){
    ca va comme CMI???
    J'espere que ca devien comprehensible

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    Je ne vois pas l'utilité d'utiliser "secpos". Je pense que tu peux simplifier ton code comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ifstream fileI(chemin, ios_base::in);
    vector<string> fichier;
    getline(ifstream, string buffer) vectoeur.push_back(buffer);
    fileI.close();
     
    vector<string>::iterator iter;
     
    for(iter=fichier.begin();iter!=fichier.end();iter++)
       {
       string temp = *iter;
       if (temp.find("=",1)!=string::npos){
             ect
    Par contre ça m'étonne que ton code compile, il manquerait pas un ";" après la parenthèse fermante suivant de getline?

  10. #10
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    Points : 83
    Points
    83
    Par défaut
    ouaaaa

    desoler c'est while(xx) fichier.push_backxxx.

    Bon question desisif: quelqu'un a compris ce que je veus, car des le premier message
    le probleme me semble exposer de facon assez simple et juste.>>>>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    vector<string> fichier ["un","deux",""]
    iter = fichier.begin();
    string tmp = *iter; iter++;
    tmp = *iter; iter++;
    tmp = *iter;  // ici plantage du programme, comment detecter, ou eviter ce probleme

  11. #11
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    Points : 83
    Points
    83
    Par défaut
    don a mon avis, vau mieux laisser tomber. Merci a tous.
    je penserai plus tot au code complet minimal, la prochaine fois.

  12. #12
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bon neismarspra, ça devient agaçant.
    Davidbrcz t'as demandé du code compilable ce n'est pas pour rien.

    Si l'on corrige les erreurs de ton code, on a ceci, qui marche sans problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    std::vector<std::string> fichier;
    fichier.push_back("un");
    fichier.push_back("deux");
    fichier.push_back("");
    std::vector<std::string>::iterator iter;
    iter = fichier.begin();
    std::string tmp = *iter; iter++;
    tmp = *iter; iter++;
    tmp = *iter;
    Les concepteurs de la stl seraient quand même de sacrés charlots si l'on ne pouvait pas accéder à une string vide dans un vecteur.

    Donc il doit y avoir une erreur ailleurs dans ton code, mais tant que tu ne nous le montre pas, on ne peut pas deviner.

    Edit : Je pense avoir compris ton problème.
    C'est une erreur classique, on se fait tous avoir au début. Tu penses que fichier.end() te renvoie un itérateur sur le dernier élément du vecteur. Et ben non ! En fait fichier.end() pointe juste après le dernier élément. C'est une sorte de marqueur pour indiquer la toute fin du vecteur en mémoire. Le dernier élément se trouve donc bien à (fichier.end()-1). C'est une petite différence avec fichier.begin() qui lui pointe directement sur le premier élément.

    En résumé on a ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    vecteur :  | "un"  |  "deux" |  ""  |
                  ^                         ^
                  |                         |
    itérateur:   begin()                   end()
    Le plus simple reste tout de même de parcourir ton vecteur avec une boucle for, comme le montre emiaille ci-dessous.

  13. #13
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    Je suis désolé mais ton code est encore faux, la déclaration de ton vector ne marche pas...

    Pourquoi tu ne veux pas utiliser une boucle pour parcourir ton vecteur? Sinon comment tu veux faire pour détecter la fin (liée à la taille de ton vector)?

    Essayes ce code , ça marche très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    #include <vector>
    #include <string>
     
    using namespace std;
     
    int main()
    {
    	vector<string>				fichier;
    	vector<string>::iterator	iter;
    	string						tmp;
     
    	fichier.push_back("un");
    	fichier.push_back("deux");
    	fichier.push_back("");
     
    	for(iter = fichier.begin(); iter!=fichier.end(); iter++)
    	{
    		tmp = *iter;
    		cout << tmp << endl;
    	}
    }

  14. #14
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    Points : 83
    Points
    83
    Par défaut
    je doit tous dabord des excuses a vous tous (en dehors du code compilable: cf plus loin).

    bon, dabord emiaille:
    ben, faut dire qu'avec mes autre message, j'esperer que vous allez comprendre que je declare pas mon vector avec [ xx,xx,xx], mdr
    mais que ca representer les 3 ligne lu dans le fichier.
    Et je pense l'avoir dit,j'ai pas eu de probleme de compilation

    Pourquoi tu ne veux pas utiliser une boucle pour parcourir ton vecteur? Sinon comment tu veux faire pour détecter la fin (liée à la taille de ton vector)?
    je retraite le probleme du debut (cf plus loin + je sais pas trop mais j'aime pas les break dans mes boucle for. Je les trouvent mieux a leur place dans une while).
    Ca m'a paru plus clair apres 2h30 de transport en commun en rentrant du boulot.

    puis Arzar,
    ben merci encore, surtout pour la pressision du .end()


    ET conclusion:
    n'essayer pas de corriger un bug dans du code c++, quand vous avez 5ecran a surveiller au travail, et ne chercher pas toujours l'erreur la ou elle pretend etre, mais plutôt aux endroit ou le code est quasi indéchiffrable. (la fonction secpos) oui je sais je l'ai pas fourni.

  15. #15
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    Lorsque l'énoncé d'un problème est exactement connu, le problème est résolu; ou bien c'est qu'il est impossible. La solution n'est donc autre chose que le problème bien éclairé.

    Emile-Auguste Chartier

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/04/2010, 23h25
  2. [DOM] Element vide avec DOM
    Par jad_jad dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 27/05/2008, 19h11
  3. Réponses: 8
    Dernier message: 11/11/2007, 00h53
  4. Réponses: 4
    Dernier message: 24/11/2006, 17h01
  5. fonction qui en fait planter une autre
    Par ickis dans le forum C
    Réponses: 5
    Dernier message: 18/08/2003, 21h33

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