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

Autres éditeurs Discussion :

[g++] message erreur etrange


Sujet :

Autres éditeurs

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 80
    Points : 53
    Points
    53
    Par défaut [g++] message erreur etrange
    Bonjour,

    J'ai compilé un programme avec g++ sous linux et voici ce qu'il m'a repondu :
    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
     
    /home/nico/tmp/ccJMYeTF.o(.text+0xadf): In function `main':
    : undefined reference to `EnsExamples::~EnsExamples [in-charge]()'
    /home/nico/tmp/ccJMYeTF.o(.text+0xb24): In function `main':
    : undefined reference to `example::~example [in-charge]()'
    /home/nico/tmp/ccJMYeTF.o(.text+0xb38): In function `main':
    : undefined reference to `example::~example [in-charge]()'
    /home/nico/tmp/ccJMYeTF.o(.text+0xb4a): In function `main':
    : undefined reference to `example::~example [in-charge]()'
    /home/nico/tmp/ccJMYeTF.o(.text+0xb86): In function `main':
    : undefined reference to `EnsExamples::~EnsExamples [in-charge]()'
    /home/nico/tmp/ccJMYeTF.o(.text+0xbe5): In function `main':
    : undefined reference to `example::~example [in-charge]()'
    /home/nico/tmp/ccJMYeTF.o(.text+0xc13): In function `main':
    : undefined reference to `example::~example [in-charge]()'
    /home/nico/tmp/ccJMYeTF.o(.text+0xc39): In function `main':
    : undefined reference to `example::~example [in-charge]()'
    collect2: ld returned 1 exit status
    J'ai encore jamais vu ce type de message, et il me semble un peu ... etrange a mon gout.
    Si quelqu'un voit d'ou ca vient merci de me le faire savoir.

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de alexrtz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 639
    Points : 1 359
    Points
    1 359
    Par défaut
    Salut,

    Cela ressemble à un problème d'édtition de liens.

    Pourrais-tu mettre le code (ou un lien vers ton fichier source ou une archive si le code est très long) pour que l'on puisse tester?
    "Je suis incapable d'expliquer ce qui se passa ensuite : je lâchai quelque chose, quelque chose à quoi je m'agrippais depuis toujours sans m'en rendre compte. Je m'enfonçais dans une obscurité chaude, moelleuse et protectrice, tandis qu'un loup montait la garde par mes propres yeux."

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    325
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 325
    Points : 228
    Points
    228
    Par défaut
    Je dirais la même chose, tu as du oublié d'include une bibliothèque, ou un truc du genre. Poste ton code.

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Dans mes souvenirs, il y a deux raisons pour cetype d'erreurs. L'une d'entre elle est l'oubli de définir (ou de lier avec la définition) des functions, genre le destructeur.

    Si ce n'est pas ça, il faudrait que tu nous montres un exemple minimal mais complet qui reproduise cette erreur avec les lignes de commandes utilisées pour compiler.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    Voici un bout de code qui me reproduit la meme erreur :

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    #include <iostream>
     
    using namespace std;
     
     
    //struct of an example
    struct example
    {
      char *in;
      char *out;
     
      example(char [] , char []);
     ~example(void);
    };
     
    example::example(char ti[] , char to[])
    {
      in = ti;
      out = to;
     
      return;
    }
     
     
    //struct of an array of examples
    class EnsExamples
    {
      example *pointex;
     
    public :
      EnsExamples(example []);
      ~EnsExamples(void);
      void info (void);
    };
     
    EnsExamples::EnsExamples(example ex[])
    {
      pointex = ex;
      return;
    }
     
     
    void EnsExamples::info(void)
    {
      cout <<"There is "<<sizeof(pointex)<<"examples in this array"<<endl;
      return;
    }
     
     
     
    int main (void)
    {
      char in1[1]={1};
      char out1[3]={1,0,1};
      char in2[1]={0};
      char out2[3]={0,0,0};
      example e1(in1,out1);
      example e2(in2,out2);
      example tab [2]={e1,e2};
     
      EnsExamples ex0(tab);
     
      ex0.info();
     
      return 0;
    }
    pour la compilation je fait tout simplement :

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Qui se minimalise à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct toto {
        ~toto(); // pas de void en C++
    };
     
    int main() // pas de void en C++
    {
        toto t;
        return 0;
    }
    Et c'est bien ce que j'avais "hyppothésé".
    Tu n'as pas défini les destructeurs.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    Oups ! En effet j'avait oublié de définir mes destructeurs. (c'est a cause des pointeurs que ce ne marchait pas ?)
    Voici comment je les ai definis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    example::~example(void)
    {
      if(in!=NULL)delete in;
      if(out!=NULL)delete out;
    }
     
    EnsExamples::~EnsExamples(void)
    {
      if(pointex!=NULL) delete pointex;
    }
    Je sais si c'est la bonne méthode , en tout cas ca marche.

    Merci beaucoup à ceux qui m'ont mis sur la voie.

  8. #8
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Là par contre, ce code va t'exploser à la figure -- je ne dis pas ça parce qu'il n'est pas robuste, c'est un autre problème.

    Tu veux libérer un tableau (non libérable qui existe à l'extérieur)
    Un conseil passe à des types qui gèrent correctement la mémoire pour toi. std::string pour les chaînes de caractères et std::vector<> pour les tableaux.

    PS: pas besoin de tester à null avant de libérer. Dans tous les cas delete fera aussi ce test.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    Hum .... ok
    donc en c++ , il n'y a pas d'intérêt à utilisé des tableaux, et il faudrait utilisé std::vector à chaque fois ? Pour le moment j'ai pris l'habitude d'utiliser les tableaux, et je n'utilise std::vector que lorsque j'en trouve l'utilité, mais je pourrais changer si il n'y a pas d'inconvénient à utiliser std::vector.

  10. #10
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Pas d'intérêt à haut niveau. Plutôt des désanvatages en fait aux tableaux dynamiques bruts.
    En fait, on a tendance à éviter de confier la gestion brute de deux ressources à une même classe. Ce qui fait que l'on va fuir l'utilisation de pointeurs bruts. Dans le cadre des tableaux dynamiques, les vecteurs sont une assez bonne solution.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    Et il ne faut pas oublier les copains de std::vector que sont std::list, std::deque et std::set (et std::map, mais celui là n'est pas tout à fait pareil).

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    Merci pour ces précisions.

    Citation Envoyé par Luc Hermitte
    Un conseil passe à des types qui gèrent correctement la mémoire pour toi. std::string pour les chaînes de caractères et std::vector<> pour les tableaux.

    J'ai converti mon bout de prog en utilisant std::vector

    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
    56
    57
    58
     
    #include <iostream>
    #include <vector>
     
    using namespace std;
     
     
    //struct of an example
    class Example
    {
      vector <bool> in;
      vector <bool> out;
     
    public :
      Example(vector <bool> ,vector <bool>);
      ~Example(void);
    };
     
    Example::Example(vector <bool> ti , vector <bool> to)
    {
      in = ti;
      out = to;
     
      return;
    }
     
     
    //struct of an array of examples
    class EnsExamples
    {
      vector <Example> ex;
     
    public :
      EnsExamples(vector <Example>);
      ~EnsExamples(void);
      void info (void);
    };
     
    EnsExamples::EnsExamples(vector <Example> tex)
    {
      ex = tex;
      return;
    }
     
     
    void EnsExamples::info(void)
    {
      cout <<"There is "<<ex.size()<<"examples in this array"<<endl;
      return;
    }
     
     
     
    int main (void)
    {
     
      return 0;
    }
    J'obtiens ce message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     g++ test.cpp
    /home/nico/tmp/cc5HXqsK.o(.gnu.linkonce.t._ZSt8_DestroyI7ExampleEvPT_+0xd): In function `void std::_Destroy<Example>(Example*)':
    : undefined reference to `Example::~Example [in-charge]()'
    collect2: ld returned 1 exit status
    std::vector gere t-il vraiment correctement la mémoire ?

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tu déclares ton destructeur, il faut lui donner un corps. Ici tu n'en as plus besoin, enlève le donc de la déclaration de ta classe et tu ne devrais plus avoir d'erreur.

    std::vector gere t-il vraiment correctement la mémoire ?
    Oui, c'est le but. Il gère la réallocation et la destruction de manière automatique et sûre.

    Sinon petite remarque : pour des gros paramètres du genre vector, il vaut mieux les passer par référence constante.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    Merci, en effet ca fonctionne. Désolé de vous avoir dérangés pour ca !

    Quelles sont les avantages de passer les gros paramètres en référence constante ?

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Le passage par valeur entraîne une recopie du paramètre, c'est-à-dire que si ton vecteur contient 1000 éléments, un autre vecteur de 1000 élements sera créé... pour rien. Avec le passage par référence constante, tu ne paies qu'une copie de pointeur (en interne, toi tu ne voies rien), donc en général 4 octets, ce qui est une miette en comparaison.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    Ok, encore merci

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

Discussions similaires

  1. message d'erreur etrange en executant :
    Par Kuchiki Byakuya dans le forum Débuter
    Réponses: 8
    Dernier message: 21/12/2009, 14h04
  2. [C#]Message d'erreur etrange (Contraintes d'accessibilité)
    Par Jabbal'H dans le forum Windows Forms
    Réponses: 1
    Dernier message: 28/09/2006, 08h02
  3. Message erreur InterBase
    Par tchaman dans le forum InterBase
    Réponses: 9
    Dernier message: 01/04/2005, 15h50
  4. [FLASH MX 2004] message erreur de classe
    Par matN59 dans le forum Flash
    Réponses: 3
    Dernier message: 14/06/2004, 08h59
  5. [Kylix] message erreur à l'ex
    Par JlouisI dans le forum EDI
    Réponses: 5
    Dernier message: 08/03/2003, 17h47

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