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

SL & STL C++ Discussion :

Problème std::vector <std::string >


Sujet :

SL & STL C++

  1. #1
    Membre éclairé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut Problème std::vector <std::string >
    Bonjour,

    Alors voilà un std::vector qui fait planter toute l'application quand je veux ajouter une chaine de caractère définie....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void newline(void)
    {
       log_list.push_back("->         : ");  // Ne fonctionne pas 
       log_size++;
       last = log_list.end();                   // Ne fonctionne pas non plus
     
       return ;
    }
    Et pourtant l'initialisation fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       log_list.clear();
       log_list.push_back("->         : ");
       log_size = 1;
       last = log_list.begin();
    Si une âme charitable avait un petit indice...
    Merci d'avance...

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    C'est impossible à dire sans plus d'informations (ou une bonne boule de crystal).
    Pour augmenter les chances d'obtenir de l'aide il est recommandé de :
    . fournir un code complet reproduisant le problème (si possible il suffit de faire un copier-coller dans un fichier vide)
    . fournir un code qui compile
    . indiquer précisément quelle est l'erreur
    Sans aucun de ces trois éléments, c'est pas gagné...

    MAT.

  3. #3
    Membre éclairé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    L'erreur c'est un Segmentation Fault

    Le début de la classe
    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
    23
    24
    25
    26
    27
    28
    29
     
    class LoG
            {
                private:
                    /// Data
                        std::vector< std::string >            log_list;
                        int                                   log_size;
                        std::fstream                          log_file;
                        std::vector< std::string >::iterator  last;
                        long                                  start;
                        bool                                  working;
                public:
                    /// Functions
                        LoG( std::string filename)
                        {
                            working = false;
                            log_file.open(filename.c_str(), std::fstream::out | std::fstream::ate);
     
                            if(!log_file.is_open())
                                return ;
     
                            working = true;
                            start = time(NULL);
     
                            log_list.clear();
                            log_list.push_back("->         : ");
                            log_size = 1;
                            last = log_list.begin();
                        }
    L'opérateur censé faire le boulot( j'ai aussi des problèmes avec des templates...)
    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
     
    template<>
            LoG& LoG::operator<< <char>(char obj)
            {
                if(obj==ENDLOG)  // ENDLOG c'est '\n'
                {
                    (*last) += '\n';
     
                    newline();
     
                    if( log_size >= MAX_LOG_STRING )
                        flush();
                }
                else
                    (*last) += obj;
     
                return (*this);
            }
    La fonction d'ajout des const char* fonctionne quant à elle

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Le problème n'est pas reproduit chez moi.

    Voici le code testé :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #include <vector>
    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
     
    class LoG
    {
    private:
       /// Data
       std::vector< std::string >            log_list;
       int                                   log_size;
       std::fstream                          log_file;
       std::vector< std::string >::iterator  last;
       long                                  start;
       bool                                  working;
    public:
       /// Functions
       LoG( std::string filename)
       {
          working = false;
          log_file.open(filename.c_str(), std::fstream::out | std::fstream::ate);
     
          if(!log_file.is_open())
             return ;
     
          working = true;
          start = time(NULL);
     
          log_list.clear();
          log_list.push_back("->         : ");
          log_size = 1;
          last = log_list.begin();
       }
       void newline(void)
       {
          log_list.push_back("->         : ");  // Ne fonctionne pas
          log_size++;
          last = log_list.end();                   // Ne fonctionne pas non plus
     
          return ;
       }
     
    };
     
    int main()
    {
       LoG log("log");
     
       log.newline();
       log.newline();
       log.newline();
     
       return 0;
    }
    Par contre, quand j'ajoute cette méthode et que je tente de l'utiliser,
    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
       template <class T>
            LoG& LoG::operator<< (T obj)
            {
                if(obj=='\n')  // ENDLOG c'est '\n'
                {
                    (*last) += '\n';
     
                    newline();
     
                    if( log_size >= 2 )
                        log_file.flush();
                }
                else
                    (*last) += obj;
     
                return (*this);
            }
    les problèmes arrivent.

    Alors, le point qui à mon avis pose problème est En effet, il ne me semble pas que cet iterateur pointe sur un objet valide.

    Si tu veux travailler avec le dernier objet d'un vector, il y a les méthodes last() ou rbegin().

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Je ne suis pas sûr que ça vienne de là, mais effectivement, vector::end() renvoie un iterateur spécial dont le déréférencement a un résultat indéterminé.

    Autrement dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::vector<T> v;
    // on rempli v
    std::vector::iterator it = v.end();
    *it //... INTERDIT!

  6. #6
    Membre éclairé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut


    Bon, et bien il semble que j'ai bien oublier comment fonctionne les iterateurs! en effet je me rappelle maintenant le petit :

    Enfin j'attend de voir si cela résout tous les problèmes. Merci beaucoup

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    La variable log_size ne te sert à rien, le vector contient déjà la taille.

  8. #8
    Membre éclairé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    Oui je sais mais ce que je ne sais pas c'est s'il contient bien une variable qui est incrémentée à chaque ajout d'objet où si la fonction reparcours tout le vector...
    ???

  9. #9
    Invité(e)
    Invité(e)
    Par défaut
    La méthode size() ne parcourt pas le vector à chaque appel.

    Tu peux observer la méthode en question dans le fichier <vector>. (Attention aux maux de têtes)

  10. #10
    Membre éclairé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    Je vous remercie tous pour vos réponse...
    @+

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 29/09/2014, 17h12
  2. Cast d'un std::vector<T> -> std::vector<X>
    Par Dono_S dans le forum Langage
    Réponses: 3
    Dernier message: 09/04/2012, 21h31
  3. std::list ou std::vector comme argument de template
    Par epsilon68 dans le forum C++
    Réponses: 11
    Dernier message: 01/03/2011, 23h34
  4. [Tuto] Recherche de tutoriel sur std::list et std::vector
    Par pegase06 dans le forum SL & STL
    Réponses: 27
    Dernier message: 24/07/2007, 16h23
  5. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    Réponses: 20
    Dernier message: 05/01/2005, 19h15

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