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

C++ Discussion :

Erreur de compilation avec CString


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2003
    Messages : 41
    Par défaut Erreur de compilation avec CString
    Bonjour,

    Je débute en C++ et j'ai une question, lors de la compilation du code ci-dessous (avec Dev-C++) j'ai pas mal d'erreurs dû à " [Linker error] undefined reference to `CString::~CString()' " ou à " [Linker error] undefined reference to `CString::CString(char const*)' ".... etc....

    Toujours lié à CString !!! J'ai bien mon fichier cstring.h et j'en fais l'inclusion dans mon programme mais il dois me manquer qqch !!!

    Pourriez-vous m'aider ?

    PS: Cstring.h, je l'ai trouvé sur le net

    Merci d'avance

    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    #include <cstdlib>
    #include <iostream>
    #include <stdio.h>
    #include <cstring.h>
    using namespace std;
     
    class CSecurity
    {
     
      public:  
     
       CString CSecurity::Crypt(LPCSTR p_lpszTerm)
       {
        	CString strTerm = p_lpszTerm;
        	//strTerm.MakeUpper();
        	LPSTR lpczCursor = (LPSTR) (LPCSTR) strTerm;
        	CString strCrytedTerm;
        	CString strByte;
     
        	int nLength = strTerm.GetLength();
        	int nCounter = 3;
        	int nOffset;
        	int nRotation;
        	unsigned char cCrypted;
        	while (*lpczCursor)
        	{	
        		cCrypted = *lpczCursor++;
     
        		nOffset = m_pOffsetTable[nCounter++ % m_nOffsetTableSize];
        		nRotation = m_pOffsetTable[nCounter++ % m_nOffsetTableSize];
        		//cCrypted = RotLeft(cCrypted,nRotation);
         		cCrypted += nOffset;
     
        		//strByte.Format("%.2X",cCrypted);
        		strCrytedTerm += strByte;
        	}
        	strCrytedTerm = Scramble(strCrytedTerm);
        	return strCrytedTerm;
        }
        //static int DefaultOffsetTable[] = {5,9,2,6,5,3,5,9,1,4,1,5,9,2,6,5,3,5,9,1};
     
        CSecurity::CSecurity()
        {
    		 int DefaultOffsetTable[] = {5,9,2,6,5,3,5,9,1,4,1,5,9,2,6,5,3,5,9,1};
             SetOffsetTable(DefaultOffsetTable,20);
        }
     
        private :
     
        CString CSecurity::Scramble(LPCSTR p_lpszTerm)
        {
        		 CString strTerm = p_lpszTerm;
        		 int nMidPoint = strTerm.GetLength()/2;
        		 CString strLeft = strTerm.Left(nMidPoint);
        		 CString strRight = strTerm.Mid(nMidPoint);
     
        		 CString strScrambled;
        		 LPSTR lpszLeftCursor = (LPSTR) (LPCSTR) strLeft;
        		 LPSTR lpszRightCursor = (LPSTR) (LPCSTR) strRight;
        		 while ((*lpszLeftCursor) && (*lpszRightCursor))
        		 {
        		 		 if (*lpszRightCursor)
        		 		 		 strScrambled += *lpszRightCursor++;
        		 		 if (*lpszLeftCursor)
        		 		 		 strScrambled += *lpszLeftCursor++;
        		 }
        		 return strScrambled;
        }
     
        inline void CSecurity::SetOffsetTable(int* p_pOffsetTable, int p_nTableSize)
        {
        		 m_pOffsetTable = p_pOffsetTable;
        		 m_nOffsetTableSize = p_nTableSize;
        }
     
        int* m_pOffsetTable;
        int  m_nOffsetTableSize; 
    };
     
    int main()
    {
        CSecurity Test;
        Test.CSecurity::Crypt("test");
        return(0);
    }

  2. #2
    Membre confirmé Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Par défaut
    Pourquoi tu n'utilises tout simplement pas std::string? (il y a une raison particulière pour que tu utilises CString?)

    Sinon pour ton problème, peut-être que tu as simplement téléchargé l'en-tête, pas l'implémentation

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2003
    Messages : 41
    Par défaut
    Hello,

    Merci de ta réponse si rapide, pourquoi CString, car dans le code avec lequel je me suis inspirer il y avait déjà CString et j'ai continuer dans cette voie !

    peut-être que tu as simplement téléchargé l'en-tête, pas l'implémentation
    Il y a bien des chances, qu'est-ce que l'imprimentation ?

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    Et bien, en plus du .h, tu dois avoir à minima un .lib pour le lien et s'il s'agit d'un lien dynamique, à l'exécution tu auras besoin d'une DLL. CString, ca ressemble aux MFC. Je ne suis pas sur que tu puisses l'avoir comme ça.

  5. #5
    Membre confirmé Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Par défaut
    Citation Envoyé par bianconeri
    Il y a bien des chances, qu'est-ce que l'implémentation ?
    En gros, t'as tout simplement téléchargé "CString.h", pas "CString.cpp" (ou la .lib? ou dll?).
    Dans l'en-tête, tu as la définition de ta classe, ça te dis ce que la classe peut faire et dans le .cpp, tu as l'implémentation, ça te dis comment la classe fait ceci ou cela (je l'explique peut-être mal mais en gros c'est ça ), parfois l'implémentation est dans un fichier en-tête mais en générale, c'est dans le .cpp (sauf pour les templates et les fonctions inlines)

    Exemple:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <iostream>
     
    class A
    {
    public:
        void foo();
    };
     
    // implémentation de la méthode foo de la classe A
    void A::foo()
    {
        std::cout << "foo\n";
    }

  6. #6
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    CString est la classe de texte des MFC, et n'est en aucun cas définie dans cstring.h!
    cstring.h contient la définition des fonctions de manipulation de texte héritées du C (d'où le cstring.h), alors que la classe CString est définie dans afxstr.h.
    N'essaye pas d'inclure ce fichier dans ton projet, ce n'est pas aussi facile . Ca ne fonctionnera qu'avec Visual (en version complète), avec un projet MFC. J'en conclus donc que le code dont tu t'es inspiré avait été développé sous Visual.

    NB: je ne vois dans ton code aucun appel à une des fonctions de cstring.h. Il semble être inutile ici...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2003
    Messages : 41
    Par défaut
    Merci de l'information, en cherchant un peu (beaucoup) sur le net il me semble être tomber sur la même analyse que toi spoutspout !!!

    Autant pour moi, est-il possible de faire la même chose avec du "String" standard ?

    Merci de votre réponse

  8. #8
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par bianconeri Voir le message
    Autant pour moi, est-il possible de faire la même chose avec du "String" standard ?
    Si tu parles tu std::string, oui. Tu peux faire autant qu'avec un CString et plus encore.
    Voir doc STL.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2003
    Messages : 41
    Par défaut
    J'ai commencé à refaire le code en "String" malheureusement j'ai déjà des erreurs d'entré sans commencer à coder...

    Pouvez-vous me mettre sur la bonne voie ?

    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
     
    #include <cstdlib>
    #include <string.h>
    #include <iostream>
     
    using std::string; 
     
    class CSecurity
    {
          public :
     
          string CSecurity::Crypt(LPCSTR p_lpszTerm)
          {
                 String strTerm = p_lpszTerm;
        	     return strTerm;
          }  
     
          private :
    };
    Voici les erreurs

    11 C:\Dev-Cpp\Projects\GED\main.cpp expected `;' before '(' token
    17 C:\Dev-Cpp\Projects\GED\main.cpp expected `;' before "private"

  10. #10
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Voilà ton code corrigé avec des remarques:
    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
    #include <cstdlib>
    #include <string>
    #include <iostream>
    
    // soit tu mets
    using namespace std;
    // soit tu mets des std:: devant tous tes appels à la STL, mais en aucun cas ça: using std::string; 
    
    class CSecurity
    {
          public :
          
          // CSecurity:: inutile car tu es déjà dans la définition de la classe, et donc dans son scope
          string Crypt(LPCSTR p_lpszTerm)
          {
                 // string et non String
                 string strTerm = p_lpszTerm; 
        	     return strTerm;
          };  // ';' obligatoire car c'est une définition, pas une implémentation
          
          private :
    };

  11. #11
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    Bonjour;

    et si tu met

    using namespace std;

    au lieu de

    using std::string;

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2003
    Messages : 41
    Par défaut
    Merci beaucoup !

    Pourtant pour le ; à la fin j'ai pris des exemple sur le net !!!
    Pour le S de String, on va dire que c'est une mauvaise habitude de VB !

    Mais j'ai toujours un erreur vraiment bizarre,

    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
     
    #include <cstdlib>
    #include <string>
    #include <iostream>
     
    using namespace std;
     
    class CSecurity
    {
          string Crypt(LPCSTR p_lpszTerm)
          {
                 string strTerm = p_lpszTerm; 
        	     return strTerm;
          };
    };
    9 C:\Dev-Cpp\Projects\GED\main.cpp expected `;' before '(' token

  13. #13
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Est-ce bien le code de main.cpp que tu nous montres? D'une part parceque ça ressemble plus à un *.h plutôt qu'à un *.cpp, et d'autre part car le code que tu as posté fonctionne très bien chez moi (VS2005).

  14. #14
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 940
    Par défaut
    Il me semble que spoutspout s'est trompé pour le ; après la fonction, puisqu'il y a déclaration et définition (entre les {} ).

    Sinon, c'est quoi une LPCSTR ? Est-ce-que ça peut se convertir en chaîne C style ou en std::string ? Si c'est un typedef pour un char* ou assimilé ça ira, mais sinon je ne pense pas qu'il y ait de constructeur de std::string qui permette de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string strTerm = p_lpszTerm;
    C'est à quelle ligne qu'il veut un ';' ? Je n'arrive pas à identifier la 'ligne 9'.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2003
    Messages : 41
    Par défaut
    Oui c'est bien main.cpp !


    Et avec ceci cela fonctionne

    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
    #include <cstdlib>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    class CSecurity{
          
          string Crypt(char * p_lpszTerm)
          {
                 string strTerm = p_lpszTerm;
        	return strTerm;
          }; //<-- Fonctionne avec ou sans le point virgule
    };
    Je suppose que LPCSTR est un "truc" de CString et que c'est cela qui faisait planter ma classe ! Je pense que je vais bien morfler pour passer de CString en String !

    Dans tous les cas, merci de votre aide les gars !!!

  16. #16
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Il me semble que spoutspout s'est trompé pour le ; après la fonction, puisqu'il y a déclaration et définition (entre les {} ).
    Je persiste .
    Ca reste une définition (dans laquelle tu places l'implémentation).
    Citation Envoyé par Noxen Voir le message
    Sinon, c'est quoi une LPCSTR ? Est-ce-que ça peut se convertir en chaîne C style ou en std::string ?
    Oui. LPCSTR est un Long Pointer Const sur un STRing. Autrement dit, un const char*. L'opérateur = du string de la STL accepte ce type d'argument.
    Citation Envoyé par Noxen Voir le message
    mais sinon je ne pense pas qu'il y ait de constructeur de std::string qui permette de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string strTerm = p_lpszTerm;
    Effectivement, cette ligne est fausse. Lui préférer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string strTerm(p_lpszTerm);

  17. #17
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    J'ai oublié de préciser que LPCSTR est bien un typedef spécifique de Windows .
    Citation Envoyé par bianconeri
    Fonctionne avec ou sans le point virgule
    C'est vrai qu'en réfléchissant bien je n'ai jamais essayé sans. Mais dans la logique je le laisserais pour les raisons que j'ai avancées plus tôt.

  18. #18
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 940
    Par défaut
    Citation Envoyé par spoutspout Voir le message
    Ca reste une définition (dans laquelle tu places l'implémentation).
    Définition ou déclaration ? De toute façon, ici, il y a déclaration et définition, c'est d'ailleurs une fonction inline.

    Bon, effectivement, avec ou sans le ';', j'arrive à compiler (du moins sous visual, il faudrait tester avec gcc vu la discipline de M$ à respecter les normes qu'ils n'ont pas imposées eux-même). J'avoue que ça me laisse quand même perplexe. Si tu regardes tous les exemples de codes donnés sur le site, ils sont sans ';' dans le cas d'une fonction définie dans la classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string strTerm = p_lpszTerm;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string strTerm(p_lpszTerm);
    devraient être équivalent, ce sont deux appels au constructeur. Ceci-dit, après test, même l'opérateur d'affectation est compatible avec LPCSTR.

  19. #19
    Membre confirmé Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Par défaut
    spoutspout a raison, LPCSTR n'est qu'un typedef, ça ne devrait pas poser de problème (du moment qu'on include windows.h)

    En tout cas, passer de CString à std::string ne devrait pas poser de problème puisque tous deux peuvent travailler sur un const char* et LPCSTR est un const char*

  20. #20
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Définition ou déclaration ? De toute façon, ici, il y a déclaration et définition, c'est d'ailleurs une fonction inline.
    Au temps pour moi, je voulais bien dire déclaration.
    Citation Envoyé par Noxen Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string strTerm = p_lpszTerm;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string strTerm(p_lpszTerm);
    devraient être équivalent, ce sont deux appels au constructeur. Ceci-dit, après test, même l'opérateur d'affectation est compatible avec LPCSTR.
    Attention, dans le premier cas, tu appelles le constructeur puis l'opérateur d'affectation, tandis que dans le deuxième cas, tu n'appelles que le constructeur avec un paramètre.
    J'ai parlé un peu vite en disant que c'était faux : ce n'est juste pas la même chose.

Discussions similaires

  1. Erreur de compilation avec Excel_2k
    Par Debure dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/06/2006, 14h51
  2. Erreur de compilation avec APRO
    Par netchip dans le forum Langage
    Réponses: 1
    Dernier message: 22/04/2006, 23h12
  3. Erreur de compil avec Outp
    Par sixon dans le forum C++
    Réponses: 2
    Dernier message: 27/02/2006, 15h01
  4. Erreur de compilation avec SWITCH et CASE
    Par barbarello dans le forum C++
    Réponses: 4
    Dernier message: 21/01/2006, 21h47
  5. [FreePascal]Erreur de compilation avec Dev-Pascal
    Par youngeikichi dans le forum Free Pascal
    Réponses: 3
    Dernier message: 17/02/2005, 14h22

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