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 :

Concaténer des LPCSTR et un char


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Concaténer des LPCSTR et un char
    Bonjour,

    je n'arrive pas à trouver comment concaténer deux LPCSTR avec un caractère entre les deux.

    Le but est d'appeler une fonction d'une manière similaire à celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Toggle(1, 2, 3, 4, 5, 6, "texte1""\xff""texte2");
    Si j'appelle la méthode de cette manière, alors tout fonctionne bien.

    Maintenant, je reçois les paramètres via une methode qui a cette signature :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void SourceToggle( INT32 param0, INT32 param1, INT32 param2, INT32 param3, INT32 param4, INT32 param5, LPCSTR param6, LPCSTR param7, HRESULT &hr )
    et je dois concaténer param6 et param7 en insérant "\xff" entre les deux pour ensuite appeler la méthode "Toggle" qui a la signature suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void Toggle(int param0, int param1, int param2, int param3, int param4, int param5, const unsigned char* message)
    Ce qui donnerait le pseudo-code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void SourceToggle( INT32 param0, INT32 param1, INT32 param2, INT32 param3, INT32 param4, INT32 param5, LPCSTR param6, LPCSTR param7, HRESULT &hr )
    {
        Toggle(param0, param1, param2, param3, param4, param5, param6 + "\xff" + param7);
    }
    Malheureusement, ça ne fonctionne évidemment pas et je suis complètement perdu entre les LPCSTR, char * et autres joyeusetés
    Sachant qu'en plus je ne peux pas utiliser la fonction strcpy car le compilateur me signale une erreur de type "Do not use".

    Pour information, la fonction de haut niveau provient de code managé en C# et tout se passe sur des cartes embarqués en .NET MicroFramework.


    Donc, finalement, mon message pourrait se résumer à : AU SECOURS !!!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Pseudo Code:

    1) Trouver la longueur en octets de param6
    2) Trouver la longueur en octets de param7
    3) Allouer une nouvelle chaîne de taille (taille de param6 + taille de param 7 + 1 + 1)
    1 pour "\xff".
    1 pour '\0' final.

    4) Copier dans cette nouvelle chaîne param6, puis "\xff", puis param7
    Si la fonction strcpy n'est pas disponible, soit une boucle for soit la fonction memcpy soit une autre fonction.
    Mais en raisonnant en octets

    5) Ne pas oublier le '\0' final

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En clair, tu cherches une bête concaténation de chaîne, vu que LPCSTR est symplement un typedef sur const char*...

    Fais-toi une fonction char* concat_trois_chaines(const char *chn1, const char *chn2, const char *chn3) et réfléchis à comment l'implémenter...

    PS: Micro$oft cherche à interdire strcpy() pour leur solution "plus sécurisée" propriétaire strcpy_s(). Tu peux l'envoyer ch*** avec un #define _CRT_SECURE_NO_WARNINGS si tu cherches à écrire un code portable, mais si tu codes juste pour Windows il est plus simple et plus prudent d'utiliser strcpy_s() dans le cas présent.
    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.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses !

    Ceci dit, je suis en train de me demander comment dire que j'ai l'air bête sans l'écrire... Ah mince ! Trop tard



    Voici le code qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void ManagedToggle( INT32 param0, INT32 param1, INT32 param2, INT32 param3, INT32 param4, INT32 param5, LPCSTR param6, LPCSTR param7, HRESULT &hr )
    {
    	char strtmp[50] = "";
     
    	strcat(strtmp,param6);
    	strcat(strtmp,"\xff");
    	strcat(strtmp,param7);
    	NativeToggle(param0, param1, param2, param3, param4, param5, (const unsigned char*)strtmp);
    	strtmp[0]='\0';
    }
    Il est plutôt simple et je me demande encore comment j'ai pu passer à côté aussi longtemps !? Je me fourvoyais avec des LPCSTR, des casts et autres alors que ça paraît simple finalement.
    Le contrôle de la longueur de param6 et param7 est fait en amont, avant l'appel de la méthode managée. C'est pour ça que je ne teste pas ici.


    Maintenant, mais là plus pour le côté intellectuel de la chose, le code suivant ne fonctionne pas, lui

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void ManagedToggle( INT32 param0, INT32 param1, INT32 param2, INT32 param3, INT32 param4, INT32 param5, LPCSTR param6, LPCSTR param7, HRESULT &hr )
    {
    	char * strtmp = new char[50]();
     
    	strcat(strtmp,param6);
    	strcat(strtmp,"\xff");
    	strcat(strtmp,param7);
    	NativeToggle(param0, param1, param2, param3, param4, param5, (const unsigned char*)strtmp);
     
    	delete strtmp;
    }
    Sous Visual Studio, cela fonctionne, si ce n'est que le caractère \xff est représenté par un "y" tréma.
    Par contre, une fois sur un STM32F4, ça me plante le processeur. Carrément.

    Auriez-vous une idée du pourquoi ça ne marche pas ? Je penche de mon côté pour une différence de gestion de new/delete mais bon, ça reste des instructions standard, non ? Donc ça doit être autre chose qui m'échappe.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    PS: Micro$oft cherche à interdire strcpy() pour leur solution "plus sécurisée" propriétaire strcpy_s(). Tu peux l'envoyer ch*** avec un #define _CRT_SECURE_NO_WARNINGS si tu cherches à écrire un code portable, mais si tu codes juste pour Windows il est plus simple et plus prudent d'utiliser strcpy_s() dans le cas présent.
    Dans mon cas, le #define n'a aucun effet et j'ai toujours l'erreur. Comme dit dans mon premier message, peut-être pas assez clairement, je programme sur des cartes STM32F4x, pas sur un PC. Du coup, je n'ai pas forcément les mêmes outils.
    En plus, il y a une partie en C# (code managé, donc) et une partie en C/C++ native.

    En ce qui concerne strcpy, je pense que la limitation est peut-être dûe au fait que c'est .NET certes, mais MicroFramework, et qu'il y a certainement des limitations liées à la mémoire. Par exemple.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    OK.

    D'un autre côté, il y a quand même des trucs bizarres:

    Pourquoi ta fonction ManagedToggle() prend-elle une chaîne native en paramètre, et pourquoi la chaîne acceptée par NativeToggle() est-elle faite de unsigned chars?
    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.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Pour faire rapide, je dirais que je suis "le cul entre deux chaises"...

    D'un côté il y a Visual Studio qui me génère des stubs depuis des prototypes managés, avec les paramètres String qui deviennent des LPCSTR, sans que j'ai spécialement mon mot à dire. Mais que pourrais-je dire, en fait ?

    Et d'un autre côté, je dois appeler une méthode d'une lib qui ne m'appartient pas, laquelle prend donc ce paramètre en unsigned char *. J'imagine cependant que le unsigned char est là pour pouvoir gérer correctement le "\xff".

    Mon code se situe donc à l'interface des deux et est curieusement nommé "driver" dans le système NETMF.
    C'est la première fois que j'utilise une lib externe pour accéder aux ressources matérielles (un FTDI FT800, en l'occurence). D'habitude, je suis le dernier maillon de la chaine et j'accède au matériel directement. Je n'ai donc pas ce souci de chaines de caractères puisque j'envoie principalement des unsigned char (bytes).

    Le compilateur C est Keil, pour info.

    Voili voilou.


    Edit:

    Pour te situer ce que je fais : http://www.mikrobusnet.org/project/quail-mainboard
    Et le résultat pour le FTDI FT800 : http://mikrobusnet.org/bb/index.php/topic,322.0.html

    Le code natif (C/C++) est destiné au "firmware" de la carte Quail et le code managé (C# ou VB.Net) est là pour faire le lien avec la partie .NET MicroFramework qui est utilisée pour programmer les applications qui tourneront sur la carte.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ah OK, je commence à peu près à comprendre.
    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.

Discussions similaires

  1. Comment concaténer des variables char
    Par pierrot10 dans le forum C++
    Réponses: 8
    Dernier message: 15/07/2013, 13h26
  2. Réponses: 1
    Dernier message: 30/12/2005, 10h57
  3. concatener des "phrases" dans un char*
    Par thierry_b dans le forum C
    Réponses: 3
    Dernier message: 13/11/2005, 11h45
  4. [débutant] concaténer des champs.
    Par goony dans le forum Langage SQL
    Réponses: 15
    Dernier message: 25/08/2005, 08h28
  5. Concaténer des lignes d'enregistrements dans une colonne
    Par dany13 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 08/07/2005, 21h56

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