Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de linking lors de l'appel de deux fonctions

Sujet résolu
    5 avril 2008 à 19:02:30

    Bonjour tout le monde,

    J'ai un problème que je n'arrive pas à résoudre, je viens donc demander de l'aide.

    J'ai un problème de linking, voici déjà les messages d'erreur :

    Citation : Mon compilo adoré

    Vehicule3.obj : error LNK2001: unresolved external symbol "public: char const * __thiscall CVoiture::Immatriculation(void)const " (?Immatriculation@CVoiture@@QBEPBDXZ)
    Vehicule3.obj : error LNK2001: unresolved external symbol "public: short __thiscall CVoiture::NombreDePersonnes(void)const " (?NombreDePersonnes@CVoiture@@QBEFXZ)



    Je pense que le problème vient de cette fonction :

    1. void CLeTout::Afficher() const
    2. {
    3.         printf("Voitures :\n");
    4.         for (long nR=0; nR < 2; nR++) //m_TV.Nombre() à la place du 2
    5.         {
    6.                 CVoiture& V = m_TV.Element(nR); //Voir la fonction CVoiture& CTabVotiures::Element...
    7.                 printf("- Immatriculation : %s\n  - Nombre de place : %lg\n  - VTM : %lg\n",V.Immatriculation(),V.NombreDePersonnes(),V.VTM());
    8.                         /* exemple --> printf("- rectangle n°%ld :\n  - nom : %s\n  - longueur : %lg\n  - largeur : %lg\n  - surface : %lg\n",
    9.                         nR+1,R.Nom(),R.Longueur(),R.Largeur(),R.Surface());*/
    10.         }
    11. }


    Voici le .h qui va avec :

    1. #include <BasicConsole.h>
    2. #include "chaine.h"
    3. class Vehicule3;
    4. class CVoiture;
    5. class CTabVoitures;
    6. class Vehicule3
    7. {
    8. public:
    9.         Vehicule3();
    10.         Vehicule3(const Vehicule3& Modele);
    11.         Vehicule3(const char* UneImmatriculation, short UnNombreDePlace);
    12.         ~Vehicule3();
    13.         const char*                     Immatriculation() const; // accesseur du nom
    14.         bool                            EstValide() const;
    15.         bool            Immatriculation(const char* UneImmatriculation); //modificateur de Immatriculation
    16.         bool            NombreDePersonnes(short UnNombre); //Permet de modifier le membre m_NombreDePersonnes --> modificateur
    17.         short           NombreDePersonnes() const; //Permet de retourner le nombre de Personnes
    18.         bool            NombreDePersonnesEstValide() const; //permet de savoir si les valeurs dans m_NombreDePersonnes sont ok ou pas
    19. private:
    20.         CChaine         m_Immatriculation;
    21.         short           m_NombreDePersonnes;
    22. };
    23. class CVoiture : public Vehicule3
    24. {
    25. friend CTabVoitures;
    26. public:
    27.         CVoiture();
    28.         CVoiture(const CVoiture& Modele);
    29.         CVoiture(const char* UneImmatriculation,short UnNombreDePlace,double UnVolumeTransportableDeMarchandise);
    30.         ~CVoiture();
    31.         double          VTM() const;
    32.         bool            VTM(double UneValeurTransportableDeMarchandise);
    33.         bool            EstValide() const;
    34.         short           CVoiture::NombreDePersonnes() const;
    35.         const char*     CVoiture::Immatriculation() const;
    36.         private:
    37.         static int                      FctnComparerN(const void* p1, const void* p2);
    38.         static int                      FctnComparerSN(const void* p1, const void* p2);
    39.         int                                     ComparerN(const CVoiture& Autre) const;
    40.         int                                     ComparerSN(const CVoiture& Autre) const;
    41. private:
    42.         double          m_VTM; //Volume transportable de marchandise
    43. };
    44. class CTabVoitures
    45. {
    46. public:
    47.         CTabVoitures();
    48.         ~CTabVoitures();
    49.         bool            Ajouter(const CVoiture& Modele);
    50.         long            Nombre() const;
    51.         bool            Supprimer(long Indice);
    52.         CVoiture&                       Element(long Indice) const;
    53.         long                            Indice(const char* Nom) const;
    54.         void                            Vider();
    55.         void                            Trier();
    56. private:
    57.         long            m_Nombre;
    58.         CVoiture**      m_Tableau;
    59. };
    60. class CLeTout
    61. {
    62. public:
    63.         CLeTout();
    64.         ~CLeTout();
    65.         bool            Charger(const char* NomFichier);
    66.         void            Afficher() const;
    67.         CChaine         Immatriculation() const;
    68. private:
    69.         private:
    70.         static bool                     FctnTraiterLigne(const CChargeurFichierTexte& CC, void* Contexte);
    71.         bool                            TraiterLigne(const CChargeurFichierTexte& CC);
    72. private:
    73.         CTabVoitures    m_TV; //Tableau de voitures
    74. };


    et au cas où voici le code entier de mon cpp :

    Je vous remercie d'avance pour votre aide.

    beegees

    1. #include <BasicConsole.h>
    2. #include "vehicule3.h"
    3. #include "chaine.h"
    4. #include <search.h>
    5. ///////////////////////////////
    6. // Class Vehicule3           //
    7. ///////////////////////////////
    8. Vehicule3::Vehicule3()
    9. :m_Immatriculation(""),m_NombreDePersonnes(0)
    10. {
    11. }
    12. Vehicule3::Vehicule3(const Vehicule3& Source)
    13. :m_Immatriculation(Source.m_Immatriculation),m_NombreDePersonnes(Source.m_NombreDePersonnes)
    14. {
    15. }
    16. Vehicule3::Vehicule3(const char* UneImmatriculation,short UnNombreDePlace)
    17. {
    18. }
    19. Vehicule3::~Vehicule3()
    20. {
    21. }
    22. bool Vehicule3::EstValide() const
    23. {
    24.         return !m_Immatriculation.EstVide();
    25. }
    26. bool Vehicule3::Immatriculation(const char* UneImmatriculation)
    27. {
    28.         return m_Immatriculation.Chaine(UneImmatriculation);
    29. }
    30. short   Vehicule3::NombreDePersonnes() const
    31. {
    32.         return m_NombreDePersonnes;
    33. }
    34. bool Vehicule3::NombreDePersonnesEstValide() const
    35. {
    36.         return ((m_NombreDePersonnes > 0) && (m_NombreDePersonnes < 200));
    37. }
    38. bool  Vehicule3::NombreDePersonnes(short UnNombre)
    39. {
    40.         if (NombreDePersonnes < 0) return false;
    41.         m_NombreDePersonnes = UnNombre;
    42.         return true;
    43. }
    44. /*const char* Vehicule3::Nom() const
    45. {
    46.         return m_Immatriculation.Chaine();
    47. }*/
    48. ///////////////////////////////
    49. // Class Voiture             //
    50. ///////////////////////////////
    51. CVoiture::CVoiture()//constructeur par défaut
    52. :m_VTM(0.0)
    53. {
    54. }
    55. CVoiture::CVoiture(const CVoiture& Source) //constructeur par copie
    56. :Vehicule3(Source),m_VTM(Source.m_VTM) //une question que je me pose, est-ce que Vehicule3(Source) contient tous les membres de Véhicules3 ?
    57. {
    58. }
    59. CVoiture::CVoiture(const char* UneImmatriculation,short
    60.           UnNombreDePlace,double UnVolumeTransportableDeMarchandise)
    61.           :Vehicule3(UneImmatriculation, UnNombreDePlace),m_VTM(0.0)
    62. {
    63.         VTM(UnVolumeTransportableDeMarchandise);
    64. }
    65. CVoiture::~CVoiture()
    66. {
    67. }
    68. bool            CVoiture::EstValide() const
    69. {
    70.         return ((Vehicule3::EstValide) && (m_VTM > 0) && (Vehicule3::NombreDePersonnes()));
    71. }
    72. bool CVoiture::VTM(double UneValeurTransportableDeMarchandise)
    73. {
    74.         if(UneValeurTransportableDeMarchandise <= 0.0) return false;
    75.         m_VTM = UneValeurTransportableDeMarchandise;
    76.         return true;
    77. }
    78. double CVoiture::VTM() const
    79. {
    80.         return m_VTM;
    81. }
    82. CVoiture& CTabVoitures::Element(long Indice) const
    83. {
    84.         static CVoiture Poubelle;
    85.         return ( (Indice >= 0) && (Indice < m_Nombre) ) ? *(m_Tableau[Indice]) : Poubelle;
    86. }
    87. /*static*//* int CVoiture::FctnComparerN(const void* p1, const void* p2)
    88. {
    89.         const CVoiture** r1 = (const CVoiture**)p1;
    90.         const CVoiture** r2 = (const CVoiture**)p2;
    91.         return (*r1)->ComparerN(*(*r2));
    92. }*/
    93. /*static*//* int CVoiture::FctnComparerSN(const void* p1, const void* p2)
    94. {
    95.         const CVoiture** r1 = (const CVoiture**)p1;
    96.         const CVoiture** r2 = (const CVoiture**)p2;
    97.         return (*r1)->ComparerSN(*(*r2));
    98. }*/
    99. /*int CVoiture::ComparerN(const CVoiture& Autre) const
    100. {
    101.         return strcmp(Nom(),Autre.m_Immatriculation());
    102. }*/
    103. /*
    104. int CVoiture::ComparerSN(const CVoiture& Autre) const
    105. {
    106.         if (Surface() < Autre.Surface()) return -(-1);
    107.         if (Surface() > Autre.Surface()) return -(1);
    108.         return strcmp(Nom(),Autre.Nom());
    109.         //return ComparerN(Autre);
    110. }*/
    111. ///////////////////////////////
    112. // Class CTabVoitures        //
    113. ///////////////////////////////
    114. CTabVoitures::CTabVoitures()
    115. :m_Nombre(0),m_Tableau(NULL)
    116. {
    117. }
    118. CTabVoitures::~CTabVoitures()
    119. {
    120.         Vider();
    121. }
    122. CLeTout::CLeTout()
    123. {
    124. }
    125. CLeTout::~CLeTout()
    126. {
    127. }
    128. bool CTabVoitures::Ajouter(const CVoiture& Modele)
    129. {
    130.         if (!Modele.EstValide()) return false;
    131.         //if (Indice(Modele.Nom()) >= 0) return true;
    132.         CVoiture* AAjouter = new CVoiture(Modele); //constructeur par copie
    133.         if (AAjouter == NULL) return false;
    134.         void* Nouveau = realloc(m_Tableau,(m_Nombre+1)*sizeof(CVoiture*));
    135.         if (Nouveau == NULL)
    136.         {
    137.                 delete AAjouter;
    138.                 return false;
    139.         }
    140.         m_Tableau = (CVoiture**)Nouveau;
    141.         m_Tableau[m_Nombre] = AAjouter;
    142.         m_Nombre++;
    143.         return true;
    144. }
    145. void CTabVoitures::Vider()
    146. {
    147.         if (m_Tableau != NULL)
    148.         {
    149.                 for (long n=0; n < m_Nombre; n++) delete m_Tableau[n];
    150.                 free(m_Tableau);
    151.                 m_Tableau = NULL;
    152.                 m_Nombre = 0;
    153.         }
    154. }
    155. bool CTabVoitures::Supprimer(long Indice)
    156. {
    157.         if ( (Indice < 0) || (Indice >= m_Nombre) ) return false;
    158.         delete m_Tableau[Indice];
    159.         if (Indice < (m_Nombre-1)) memmove(m_Tableau+Indice,m_Tableau+(Indice+1),((m_Nombre-1)-Indice)*sizeof(CVoiture*));
    160.         m_Nombre--;
    161.         /*
    162.         if (m_Nombre > 0)
    163.                 m_Tableau = (CCercle**)realloc(m_Tableau,m_Nombre*sizeof(CCercle*));
    164.         else
    165.         {
    166.                 free(m_Tableau);
    167.                 m_Tableau = NULL;
    168.         }
    169.         */
    170.         return true;
    171. }
    172. long CTabVoitures::Nombre() const
    173. {
    174.         return m_Nombre;
    175. }
    176. /*CVoiture& CTabVoitures::Element(long Indice) const
    177. {
    178.         static CVoiture Poubelle;
    179.         return ( (Indice >= 0) && (Indice < m_Nombre) ) ? *(m_Tableau[Indice]) : Poubelle;
    180. }*/
    181. /*long CTabVoitures::Indice(const char* Nom) const
    182. {
    183.         if (m_Nombre == 0) return -1;
    184.         CVoiture        ModeleRecherche(Nom,1,1);
    185.         //if (!ModeleRecherche.EstValide()) return -1;
    186.         CVoiture*       pRecherche = &ModeleRecherche;
    187.         unsigned int n = m_Nombre;
    188.         CVoiture** pResultat = (CVoiture**)_lfind(&pRecherche,m_Tableau,&n,sizeof(CVoiture*),CVoiture::FctnComparerN);
    189.         return (pResultat != NULL) ? pResultat - m_Tableau : -1;
    190. }*/
    191. /*
    192. void CTabVoitures::Trier()
    193. {
    194.         if (m_Nombre >= 2) qsort(m_Tableau,m_Nombre,sizeof(CVoiture*),CVoiture::FctnComparerSN);
    195. }*/
    196. ///////////////////
    197. // Class CLeTout //
    198. ///////////////////
    199. bool CLeTout::FctnTraiterLigne(const CChargeurFichierTexte& CC, void* Contexte)
    200. {
    201.         return ((CLeTout*)Contexte)->TraiterLigne(CC);
    202. }
    203. bool CLeTout::Charger(const char* NomFichier) //copie telle quelle
    204. {
    205.         CChargeurFichierTexte   Chargeur;
    206.         /*chargeur.Charger, je lui passe le nom du fichier et le contexte et il faudra aussi lui
    207.           passer le séparateur de caractère qui est utilisé par la méthode "Définir" de la classe
    208.           "CChaineComposée" et il faut aussi lui passer en plus du contexte la fonction qu'il doit
    209.           appeler, ça sera "FctnTraiterLigne", ici je lui passe l'adresse de cette fonction là.*/
    210.         return Chargeur.Charger(NomFichier,'\t',CLeTout::FctnTraiterLigne,this);
    211. }
    212. bool CLeTout::TraiterLigne(const CChargeurFichierTexte& CC)
    213. {
    214.         if (strlen(CC.Champs(0)) == 1) switch (CC.Champs(0)[0])
    215.         {
    216.                 case 'V':
    217.                         if (CC.NombreChamps() == 4) m_TV.Ajouter(CVoiture(CC.Champs(1),atof(CC.Champs(2)),atof(CC.Champs(3))));
    218.                         break;
    219.         }
    220.         return true;
    221. }
    222. /*CChaine Immatriculation() const
    223. {
    224.         return
    225. }*/
    226.   void CLeTout::Afficher() const
    227. {
    228.         printf("Voitures :\n");
    229.         for (long nR=0; nR < 2; nR++) //m_TV.Nombre() à la place du 2
    230.         {
    231.                 CVoiture& V = m_TV.Element(nR); //Voir la fonction CVoiture& CTabVotiures::Element...
    232.                 printf("- Immatriculation : %s\n  - Nombre de place : %lg\n  - VTM : %lg\n",V.Immatriculation(),V.NombreDePersonnes(),V.VTM());
    233.                         /* exemple --> printf("- rectangle n°%ld :\n  - nom : %s\n  - longueur : %lg\n  - largeur : %lg\n  - surface : %lg\n",
    234.                         nR+1,R.Nom(),R.Longueur(),R.Largeur(),R.Surface());*/
    235.         }
    236. }







    • Partager sur Facebook
    • Partager sur Twitter

    Problème de linking lors de l'appel de deux fonctions

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown