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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    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 confirmé
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    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 : 33
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    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.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    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 confirmé
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    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 confirmé
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    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 : 33
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Montre un code complet minimal et compilable avec le fichier approprié qui reproduit le problème.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  8. #8
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    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

+ 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