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 :

Warning avec <list>


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut Warning avec <list>
    Bonjour,

    j'ai ce warning bizarre avec MinGW:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Compiling: utilities.cpp
    C:/Program Files/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_list.h: In member function `void FileArchiver::add_file(const char*)':
    C:/Program Files/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_list.h:435: warning: '__p' might be used uninitialized in this function
    Voilà mon code:

    Code utilities.hh : 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
    /* classe pour stocker plusieurs fichiers dans un seul */
    class FileArchiver
    {
        public:
            struct entete
            {
                std::string nom;
                unsigned long long pos;
                unsigned long long len;
                entete(std::string nom, unsigned long long pos, unsigned long long len) : nom(nom), pos(pos), len(len) {}
            };
     
            std::ofstream out;
            std::list<entete> entetes;
            unsigned long long cur_pos;
     
            /*prend en paramètre le nom de l'archive */
            FileArchiver(const char *path);
     
            //rajoute un fichier à l'archive
            void add_file(const char *path);
            //ajoute les entêtes à la fin
            void finish();
    };

    Code utilities.cpp : 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
    FileArchiver::FileArchiver(const char *path) :out(path, ios::binary), entetes()
    {
        if (!out)
        {
            throw string("Erreur lors du chargment dans FileArchiver: " +string (path));
        }
     
        cur_pos = 0;
    }
     
    void FileArchiver::add_file(const char *path)
    {
        unsigned long long size;
     
        ifstream in(path, ios::binary);
     
        if (!in)
        {
            throw string ("Erreur lors de l'addition d'un fichier: " + string(path));
        }
     
        // get pointer to associated buffer object
        filebuf *pbuf=in.rdbuf();
     
        // get file size using buffer's members
        size=pbuf->pubseekoff (0,ios::end,ios::in);
        pbuf->pubseekpos (0,ios::in);
     
        char buffer[size];
        pbuf->sgetn (buffer,size);
     
        out.write(buffer, size);
     
        entetes.push_back(entete(path, cur_pos, size));
        cur_pos += size;
    }
     
    void FileArchiver::finish()
    {
        list<entete>::iterator it;
     
        for (it = entetes.begin(); it != entetes.end(); ++it)
        {
            out << it->nom << " " << it->pos << " " << it->len << endl;
        }
     
        out << ((entetes.back()).pos + (entetes.back()).len) << flush;
    }

    Je pense que le warning se produit à cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    entetes.push_back(entete(path, cur_pos, size));
    entetes est une list<entete> (voir la définition de la classe).

    A l'exécution, donc j'ai le warning montré plus haut. Le warning parle de cette fonction ci de la STL (en disant __p might not be initialized here...):
    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
          _Node*
          _M_create_node(const value_type& __x)
          {
    	_Node* __p = this->_M_get_node();
    	try
    	  {
    	    std::_Construct(&__p->_M_data, __x);
    	  }
    	catch(...)
    	  {
    	    _M_put_node(__p);
    	    __throw_exception_again;
    	  }
    	return __p;
          }
    Faut-il que j'initialise ma liste quelque part? sachant que pour l'instant tout marche très bien.

    Pour ceux qui me diraient de ne pas réinventer la roue, je n'ai trouvé aucune lib faisant ça (il y a bien zzip, mais j'arrive pas à l'installer...).

    Merci!

  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 un warning pour lequel tu ne peux pas grand chose...
    Tout ce que tu peux faire c'est mettre l'inclusion à <list> dans un .h séparé avec juste avant un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifdef __GNUC__
    #   pragma GCC system_header
    #endif
    Ce qui a pour effet de désactiver les warnings pour le fichier courant.

    MAT.

  3. #3
    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
    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
    void FileArchiver::add_file(const char *path)
    {
        unsigned long long size;
     
        ifstream in(path, ios::binary);
     
        if (!in)
        {
            throw string ("Erreur lors de l'addition d'un fichier: " + string(path));
        }
     
        // get pointer to associated buffer object
        filebuf *pbuf=in.rdbuf();
     
        // get file size using buffer's members
        size=pbuf->pubseekoff (0,ios::end,ios::in);
        pbuf->pubseekpos (0,ios::in);
     
        char buffer[size];
        pbuf->sgetn (buffer,size);
     
        out.write(buffer, size);
     
        entetes.push_back(entete(path, cur_pos, size));
        cur_pos += size;
    }
    Les VLAs ne font pas partie du C++, étant donné qu'ils posent quelques problèmes.
    Ensuite, pourquoi tu déclares size sans la définir ? Attends de pouvoir définir une variable avant de la déclarer.
    Tu devrais initialiser cur_pos dans le constructeur-initialiseur, pas dans le constructeur.
    Pas de using namespace std à la portée d'un fichier, surtout dans une entête... Et inutile de copier la string encore une fois quand tu lèves une exception...

    Faut-il que j'initialise ma liste quelque part? sachant que pour l'instant tout marche très bien.
    valgrind te dit rien ?

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    les VLAs c'est trop pratique pour que je m'en passe.
    Par contre la string oui c'est trop bête je vais changer ça.

    Le using namespace std, je ne l'ai pas mis dans l'entête (tu peux remarquer que dans l'entête j'utilise std::string, etc.)

    Merci pour la méthode pour enlever le warning (je n'ai pas de valgrind)

    Edit:
    La méthode pour enlever le warning avec minGW ça marche pas pour moi :s

    Je vois pas le problème avec cur_pos, j'ai qu'un constructeur?

    Merci de votre aide en tout cas

  5. #5
    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
    Citation Envoyé par coyotte507 Voir le message
    La méthode pour enlever le warning avec minGW ça marche pas pour moi :s
    C'est pas forcément étonnant en fait à la réflexion...
    Le warning apparait lors de la compilation et non de l'inclusion de <list>, c'est ça ? Si tu commentes la ligne avec le push_back il disparait ?

    MAT.

  6. #6
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Oui exactement, j'ai 0 warnings dans ce cas ^^
    @loufoque: Pour cur_pos, je vais le mettre dans la liste d'initialisation (j'avais pas compris)

Discussions similaires

  1. probleme avec zone liste modifiable en mode continu
    Par hellosct1 dans le forum Access
    Réponses: 3
    Dernier message: 16/11/2005, 13h47
  2. petit soucis avec les listes
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/09/2005, 10h08
  3. Réponses: 2
    Dernier message: 30/07/2004, 15h09
  4. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 12h32

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