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 :

Retour d'un LPCSTR


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut Retour d'un LPCSTR
    Bonjour,

    J'ai créé une classe Language qui contient un membre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private:
     
    vector<string> Msg_Language;
    J'ai un accesseur sur ce membre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string CLanguage::Get_MsgLanguage(int idx) const
    {
    	return Msg_Language[idx];
    }
    D'autre part, j'ai créé une fonction de traduction du message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template<typename T>
    LPCSTR get_translation(int ID_Msg,T tParameter)
    {   
    	static CLanguage& My_Language = CLanguage::getInstance(""); // Getting the single language instance
    	string s = My_Language.Get_MsgLanguage(ID_Msg);
    	return s.c_str();
    }
    Et j'utilise cette fonction dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetDlgItemText(hwndDlg,IDC_ENTER_NEW_RESOLUTION,get_translation(ID_MSG_ENTER_NEW_RESOLUTION,""));
    Le problème est le suivant :

    La variable s est tout à fait cohérente au debugging.
    Par contre, la valeur retournée par get_translation elle ne l'est pas. Ma boîte de dialogue affiche du charabia ...
    Même chose sur une variable intermédiaire de test : LPCSTR ss = get_translation

    Si vous avez des idées ...

    Merci à tous ...

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je pense que tu as un problème de mariage UNICODE/non unicode.

    ton vector est un vector de string (donc non unicode).

    Je parie que ton projet est quant à lui compilé en unicode.

    Essaye d'utiliser un vector de wstring pour que tout le monde ait la même taille de caractères.

    Autre chose, ton accesseur, il retourne une string, il pourrait retourner une référence de string (car la string est déjà allouée par ton vector)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const wstring & CLanguage::Get_MsgLanguage(int idx) const
    {
    	return Msg_Language[idx];
    }
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut
    Merci beaucoup

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Dans ta fonction de traduction, s est une variable temporaire. Tu retourne un pointeur interne à cette variable (le c_str()) puis cette variable temporaire est détruite : Ton pointeur devient alors invalide.

    En général, on utilise c_str à la dernière seconde, au moment où l'on a besoin de la chaîne. Pourquoi ne pas faire retourner à get_translation une string ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Dans ta fonction de traduction, s est une variable temporaire. Tu retourne un pointeur interne à cette variable (le c_str()) puis cette variable temporaire est détruite : Ton pointeur devient alors invalide.
    Ha tien, pas vu !!

    Citation Envoyé par JolyLoic Voir le message
    Pourquoi ne pas faire retourner à get_translation une string ?
    Ou même une référence constante de string puisque la string est déjà allouée dans le vecteur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template<typename T>
    const wstring & get_translation(int ID_Msg,T tParameter)
    {   
    	static CLanguage& My_Language = CLanguage::getInstance(""); // Getting the single language instance
    	return My_Language.Get_MsgLanguage(ID_Msg);
    }
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    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
    Salut,
    C'est parce que tu as simplifié ton exemple sinon quel est l'intérêt du paramètre générique T ?

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Retour au mode texte par défaut
    Par coca dans le forum x86 16-bits
    Réponses: 6
    Dernier message: 12/12/2002, 17h22
  3. [XP] Retour d'experience
    Par virgile04 dans le forum Méthodes Agiles
    Réponses: 10
    Dernier message: 22/10/2002, 08h25
  4. Retour chariot dans un TMemo ?
    Par Vincent PETIT dans le forum C++Builder
    Réponses: 7
    Dernier message: 27/08/2002, 18h55
  5. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47

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