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

Boost C++ Discussion :

problème sur l'affectation d'un path


Sujet :

Boost C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Par défaut problème sur l'affectation d'un path
    Bonsoir,

    j'ai un problème qui me prend la tête, je vous le soumets en espérant que vos cerveaux seront mieux équipés que le mien...

    voilà, j'ai une structure dans laquelle j'ai un objet path :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct fichiers
    {
    	boost::filesystem::path path;
    	/* ... */
    } fichier;
    et j'ai la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fichier * push(const boost::filesystem::path& _path)
    {
    	fichier *f = (fichier*)malloc(sizeof(fichier));
    	if(!f)	exit(1);	// Si l'allocation a échoué
     	f->path = _path;
    	return f;
    }
    Cette fonction est appelée plusieurs fois, et à un certain moment (alors que le path semble valide, je peux l'afficher avec std::cout), ça plante à l'exécution sur ça :
    Erreur de segmentation (core dumped)
    A noter deux choses quand même :
    1) le répertoire sur lequel ça bloque ne change pas d'une fois sur l'autre
    2) en revanche, lorsque je modifie la fonction et que je lui passe en argument le path au format std::string, puis que je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f->path = boost::filesystem::path(_path);
    alors là, ça plante quelques répertoires plus loin, et l'erreur est la suivante :
    *** glibc detected *** ./Affichage: free(): invalid pointer: 0x080d647c ***
    ======= Backtrace: =========
    /* ici la trace */
    ======= Memory map: ========
    /* les infos mémoire */
    Abandon (core dumped)

    Et là je ne vois pas le pourquoi du comment... Quelqu'un a une idée de ce que j'ai mal fait ?


    Merci d'avance !!

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par zarbiman Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct fichiers
    {
    	boost::filesystem::path path;
    	/* ... */
    } fichier;
    Pourquoi le typedef en C++?

    Citation Envoyé par zarbiman Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fichier * push(const boost::filesystem::path& _path)
    {
    	fichier *f = (fichier*)malloc(sizeof(fichier));
    Et là je ne vois pas le pourquoi du comment... Quelqu'un a une idée de ce que j'ai mal fait ?
    Est-ce que tu as quelque part une garantie que boost::filesystem::path est un type POD?

    Pourquoi un malloc? Pourquoi pas new?

    Surtout : est-ce du C ou du C++?

  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
    Ce qu'il fait c'est du C compilé avec un compilateur C++.
    Donc soit tu passe au C et tu oubli boost, soit tu garde boost mais du fait du vrai C++.
    "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é
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Par défaut
    Effectivement il y a une confusion de ma part : le projet est en C++, mais comme je débute avec ce langage, j'ai utilisé à certains endroits des morceaux de code C que je maîtrise mieux...

    J'ai donc utilisé un typedef, car je voulais une liste chaînée, et je pensais que ce qui était faisable en C l'était également en C++...
    Mais du coup, je ne sais pas comment adapter ce que je faisais en C pour que ça fonctionne en C++.

    Pour information, j'ai utilisé une liste chaînée plutôt qu'une classe car j'ai eu des problèmes lorsque j'ai essayé la classe. De mémoire ça devait ressembler à quelque chose dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class fichier
    {
    	private:
    	boost::filesystem::path path;
    	fichier suivant;
    	/* ... */
    }
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct fichiers
    {
    	boost::filesystem::path path;
    	struct fichiers *suivant;
    	/* ... */
    } fichier;
    Et ça ne fonctionnait pas car le compilateur ne reconnaissait pas le type fichier utilisé dans la classe fichier. Et moi je voulais un pointeur vers l'élément suivant...

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par zarbiman Voir le message
    J'ai donc utilisé un typedef, car je voulais une liste chaînée, et je pensais que ce qui était faisable en C l'était également en C++...
    C'est généralement faisable, mais c'est souvent une solution sous optimale. Si tu veux une liste chaînée de fichiers en C++, c'est déjà prêt à l'emploi :
    (il faut par contre dans ce cas que les objets fichiers soient copiables correctement).
    Citation Envoyé par zarbiman Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class fichier
    {
    	private:
    	boost::filesystem::path path;
    	fichier suivant;
    	/* ... */
    }
    Et moi je voulais un pointeur vers l'élément suivant...
    Là, tu n'a pas mis un pointeur, mais directement un objet du type en question, ce qui ne peut pas marcher.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06
  2. Problème sur fiche MDIchild
    Par nivet dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/01/2004, 08h07
  3. Problème sur GetPrivateProfileString ???
    Par Bordelique dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2003, 22h15
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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