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

Langage C++ Discussion :

Taille template de chaîne de caractères


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut Taille template de chaîne de caractères
    Hello,
    J'ai un problème "assez" simple que je n'arrive pas à résoudre. J'essaie de sérialiser en XML (avec TinyXML) des chaînes de caractères dont la taille est arbitraire. J'ai donc le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      template<unsigned long Size>
      void get_value(const TiXmlElement* node, char text[Size])
      {
        std::string temp = node->GetText();
        strncpy(temp.c_str(), text, Size);
      }
     
      template<unsigned long Size>
      void set_value(TiXmlElement* node, const char text[Size])
      {
        TiXmlText* text_node = new TiXmlText(text);
        text_node->SetCDATA(true);
        node->LinkEndChild(text_node);
      }
    La deuxième fonction passe, mais pas la première. En fait, le compilateur (icc 10.1) n'arrive pas à trouver get_value, par exemple avec le code suivant (issu de mes tests unitaires) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      char new_text[16];
      SOAPRPC::get_value(pNode, new_text);
    vous avez une idée de mon erreur toute bête ?

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    As tu, tout bêtement, essayé en précisant la taille

    Quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      char new_text[16];
      SOAPRPC::get_value<16>(pNode, new_text);
    (ou un typedef associé, why not)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Bizarre qu'il ne déduise pas.
    Et avec un code de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void get_value(TiXmlElement* node, const char (&array)[N])
            { /* ... */ }

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    As tu, tout bêtement, essayé en précisant la taille

    Quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      char new_text[16];
      SOAPRPC::get_value<16>(pNode, new_text);
    (ou un typedef associé, why not)
    Le problème, c'est que c'est appelé par un code qui est généré automatiquement avec du gccxml. Il y a plusieurs types possibles, et je me base sur le compilateur pour faire la résolution des différentes surcharges et spécialisations.
    Citation Envoyé par Nogane Voir le message
    Bonsoir,
    Ça ne marche pas chez moi non plus. (Les deux functions en fait). Avec minGW 4.3

    La seul alternative que j'aurais serais quelque chose comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      template<class T>
      void get_value(const TiXmlElement* node, T text)
      {
        std::string temp = node->GetText();
        std::strncpy(&temp[0],text, sizeof(text));
      }
    Ça marche mais je comprend bien que ce n'est pas top.

    Au fait, "strncpy(temp.c_str(), text, Size);" ne compile pas avec minGW car c_str() renvoie un "const char*" alors que strncpy attend un char*.
    Tiens, bizarre que ça ne passe pas avec Mingw. Et bizarre aussi pour strncpy, puisque j'utilise les en-têtes gcc, et je n'ai pas eu de problème. Peut-être plus un bug chez eux ?
    Citation Envoyé par Alp Voir le message
    Bizarre qu'il ne déduise pas.
    Et avec un code de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void get_value(TiXmlElement* node, const char (&array)[N])
            { /* ... */ }
    Euh... Faudra que j'essaie. Mais bon, ça ne me plaît pas trop comme écriture

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    J'ai oublié template <int N> biensûr dans mon code

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    T'as essayé ?
    Ce qui me chiffonne, c'est que le compilateur comprend bien que les deux aruments sont un const TiXmlElement* et un char[16] (par exemple), mais il n'arrive pas à instancier le code. Tu as essayé si ça marche avec ta solution ?

  7. #7
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonsoir,
    Ça ne marche pas chez moi non plus. (Les deux functions en fait). Avec minGW 4.3

    La seul alternative que j'aurais serais quelque chose comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      template<class T>
      void get_value(const TiXmlElement* node, T text)
      {
        std::string temp = node->GetText();
        std::strncpy(&temp[0],text, sizeof(text));
      }
    Ça marche mais je comprend bien que ce n'est pas top.

    Au fait, "strncpy(temp.c_str(), text, Size);" ne compile pas avec minGW car c_str() renvoie un "const char*" alors que strncpy attend un char*.

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

Discussions similaires

  1. Taille d'une chaîne de caractères
    Par walidos11 dans le forum Assembleur
    Réponses: 1
    Dernier message: 10/11/2010, 13h09
  2. La taille d'une chaîne de caractères
    Par looking_4truth dans le forum Débuter
    Réponses: 4
    Dernier message: 09/08/2010, 16h32
  3. Taille d'affichage réel d'une chaîne de caractères
    Par SheikYerbouti dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 21/02/2007, 18h46
  4. [Configuration] problème de taille de chaînes de caractères
    Par Wormus dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 21/10/2005, 15h55

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