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 :

Portage CString de C++ vers C


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Par défaut Portage CString de C++ vers C
    Bonjour,
    j'ai récupéré le code suivant (C++) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct 
    {
    	unsigned char		*cData;			/* partie data du message */
    	unsigned short		nDataLength;		/* longueur de la partie data */
    }  t_Message;
     
    myfunction(t_Message message)
    { 
    	CString	stStrData((char*)message.cData, message.nDataLength);
    	/* etc. */
    }

    Et je dois le transformer en C => j'ai écrit ceci pour récupérer la chaîne de caractère passée en paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    myfunction(t_Message message)
    { 
    	char	*stStrData;
     
    	stStrData= malloc(message.nDataLength+1);
    	memcpy(stStrData, (char*)message.cData, message.nDataLength);
    	stStrData[message.nDataLength] = 0;
    	/* etc. */
    }
    => Cela est-il correct ? N'y a-t-il pas plus simple ?
    Merci

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 175
    Par défaut
    Pour commencer quand tu as du code, il faut le mettre dans la balise code (le dièse dans l’éditeur de message).

    Ensuite, je ne fais pas beaucoup de C++, mais je peux te dire que ta méthode n'est pas bonne.

    En regardant la doc de cstring, j'ai vu qu'il y a une méthode c_str qui retourne le contenu du cstring en chaine équivalente à une chaine en C. Il est précisé aussi que c'est un pointeur sur le contenu interne du cstring et qu'il ne faut pas y toucher, il te faut donc la recopier. Tu fais ton malloc en récupérant la taille de ta chaine via la méthode size (en y ajoutant 1 pour le \0 de fin car je sais pas si size en tient compte), puis tu copie ta chaine via strcpy.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char *temp=objet_cstring.c_str();
    char *chaine=malloc(objet_cstring.size()); // size retourne un size_t qui est normalement égal à un int
    strcpy(chaine,temp);
    ...
    ...
    free(chaine); // ne pas oublier de libérer la mémoire du malloc une fois plus necessaire.
    Tu peux remplacer l'utilisation du temp par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strcpy(chaine,objet_cstring.c_str());
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Si je comprends bien, tu réécris du code C++ en C ?

    Ça m’a l’air correct, sauf que tu ne testes pas le retour de malloc (oui, personne ne le fait, c’est d’ailleurs pour ça qu’il ne faut pas faire du C).

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 446
    Par défaut
    Pour @chrtophe, CString est une classe de gestion de chaines de caractère des MFC bien antérieur à la normalisation de la STL.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Par défaut
    Salut,
    merci beaucoup pour vos réponses, oui, je réécris du code C++ en C...

    @chrtophe, je ne comprends pas ta méthode: il n'y a pas de notion d'objet en C => d'une part CString est inconnu en C, donc objet_cstring.c_str() n'est pas une syntaxe reconnue.
    D'autre part, en lisant la doc de CString, j'y lis:

    CString( LPCTSTR lpch, int nLength );
    lpch: A pointer to an array of characters of length nLength, not null-terminated.

    Aussi, je ne suis pas sûr qu'il soit possible de faire un strcpy sur une chaîne non terminée.

    Je vais donc me fier à l'avis de @white_tentacle et me dire que ça devrait fonctionner avec ce que j'ai écrit.
    Merci

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 175
    Par défaut
    Pour @chrtophe, CString est une classe de gestion de chaines de caractère des MFC bien antérieur à la normalisation de la STL.
    Il n'y avait pas de précision sur l'utilisation de MFC.

    @chrtophe, je ne comprends pas ta méthode: il n'y a pas de notion d'objet en C => d'une part CString est inconnu en C, donc objet_cstring.c_str() n'est pas une syntaxe reconnue.
    Effectivement, j'avais pas bien compris, oublies ce que j'ai dit. Je pensais que tu convertissais un CString en char*

    Par contre je connais pas ton niveau en C/C++ donc penses qu'en C les chaines de caractères n'existent pas, c'est traité comme un tableau de char terminé par \0 (ou un pointeur c). Quand tu fais le malloc, penses à ajouter la taille de ta chaine +1 (pour le \0), et je t'es dit une grosse connerie en plus, car le CString ne contient pas de \0 (du moins celui de la STL, pour la versin MFC je sais pas), donc strcpy va segfaulter, il faut remplacer par strncpy avec la taille de la chaine. L'usage de memcpy est aussi valide.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Par défaut
    Ok, merci

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    le CString ne contient pas de \0 (du moins celui de la STL, pour la versin MFC je sais pas)
    La chaîne retournée par std::string::c_str() est bel et bien terminée par un \0, et c'est le cas aussi pour les équivalents dans CString.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Portage LabVIEW 8.2 vers LabVIEW 6.1
    Par ¤Dany¤ dans le forum LabVIEW
    Réponses: 8
    Dernier message: 13/10/2008, 21h29
  2. Portage Visual C++ 2005 vers Eclipse CDT
    Par inh40 dans le forum Eclipse C & C++
    Réponses: 1
    Dernier message: 30/05/2008, 00h04
  3. Portage application 32 bits vers 64 bits
    Par joho dans le forum Général Java
    Réponses: 4
    Dernier message: 30/11/2007, 17h02
  4. Portage MS SQL Server vers Oracle 9i
    Par Gugli dans le forum SQL
    Réponses: 2
    Dernier message: 17/09/2007, 10h50
  5. [Think Pascal] Portage/conversion Think Pascal vers MAC/Windows/Linux
    Par Alain Vitry dans le forum Autres IDE
    Réponses: 1
    Dernier message: 19/03/2005, 11h24

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