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

MFC Discussion :

[MFC] Bug surnaturel (transformation CStringList -> char*


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 21
    Points : 14
    Points
    14
    Par défaut [MFC] Bug surnaturel (transformation CStringList -> char*
    Bonjour,

    Je développe une fonction qui transforme un CStringList en char**, selon 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    void Appli::CStringListToPPChar(int& nbElements, char** tableau, CStringList* liste)
    {
    	nbElements = 1;
    	tableau = new char*[1];
    	tableau[0] = _T("");
     
    	if (! liste->IsEmpty())
    	{
    		nbElements = liste->GetCount();
    		tableau = (char**)malloc(nbElements*sizeof(char*));
    		POSITION pos = liste->GetHeadPosition();
    		int i = 0;
    		CString elementCourant;
     
    		while(pos != NULL)
    		{
    			elementCourant = liste->GetNext(pos);
    			tableau[i] = elementCourant.GetBuffer(1024); //Bug ici
    			//elementCourant.ReleaseBuffer();
    			i++;
    		}
    	}
    }
    On pourrait se dire que c'est correct, sulement quand j'affecte sa valeur a , n'est pas modifié seulement l'élément en i, mais tout le tabeau, et dès que je refais un tour de boucle, toutes les valeurs se réinitialisent!!

    J'avoue que la, je suis totalement sidéré et désemparé...
    Et si j'ouvrais mon PC pour voir s'il y aurait pas un esprit frappeur dedans ca marcherait mieux à votre avis?

    MErci d'avance pour votre aide
    [/code]

  2. #2
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    il est vraiment bizzare ton code:

    1) tu passes 2 fois le meme parametres. nbElements étant un information contenu dans CStringList

    2) tu melanges du C++ avec du C. Je vois pas ce que vient faire malloc dans cette histoire.

    3) tu n'as pas bien compris l'utilisateur de GetBuffer() du CString


    laisse tomber le démontage de ton pc et passe plutot au demontage de ton code
    il y a du linge sur la corde à linge

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    1) nbElements est une valeur que je modifie dans ma fonction pour une utilisation après cette méthode (d'où le int&, paramètre par référence)

    2)la différence entre malloc et l'opérateur new pour les types primitifs est quasiment nulle, l'opérateur new faisant ne faisant qu'appeler le constructeur des classes en plus (et, à moins que cela ait changé, y'a pas de constructeur pour les type primitifs). Et puis j'avais fais une version avec le new qui ne marchait pas mieux.

    3) GetBuffer retourne bien le char* correspondant au CString non? C'est exactement ce dont j'ai besoin.

    Merci de ton aide en tout cas ( ca fait mechant comme post mais ca l'est pas!)

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    de toute façon ce que tu as ecris ne peux fonctionner .
    la memoire allouée par GetBuffer est relachée apres destruction de l'objet CString. (voir MSDN).
    qui dans ton cas est local à la fonction...
    pourquoi ne pas gerer un tableau de CString du style CArray<CString ,const char *> ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    C'etait bien le GetBuffer qui posait probleme.
    Résolu en faisant un simple cast tout bete (char*)(LPCSTR)elementCourant;

    J'avais totalement zappé le coup de la destruction. Merci a vous deux en tout cas!

  6. #6
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    1) nbElements est une valeur que je modifie dans ma fonction pour une utilisation après cette méthode (d'où le int&, paramètre par référence)
    certes mais l'information est contenu dans CStringList donc ce parametre est, d'apres moi, inutile

    2)la différence entre malloc et l'opérateur new pour les types primitifs est quasiment nulle, l'opérateur new faisant ne faisant qu'appeler le constructeur des classes en plus (et, à moins que cela ait changé, y'a pas de constructeur pour les type primitifs). Et puis j'avais fais une version avec le new qui ne marchait pas mieux.
    certes mais le mélange de code C et C++ entraine des confusions de la part du developpeur. Ca demontre une mauvaise maitrise du C++

    3) GetBuffer retourne bien le char* correspondant au CString non? C'est exactement ce dont j'ai besoin.
    non

    C'etait bien le GetBuffer qui posait probleme.
    Résolu en faisant un simple cast tout bete (char*)(LPCSTR)elementCourant;

    J'avais totalement zappé le coup de la destruction. Merci a vous deux en tout cas!
    le LPCTSTR signifie const char*. Le const n'est pas la uniquement pour faire jolie mais pour proteger l'intégriter des informations.

    en faisant cela tu autorises une modification d'une variable "private" de la class CString ce qui aura pour consequence un probable crash difficilement detectable.
    il y a du linge sur la corde à linge

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

Discussions similaires

  1. [MFC] bug uniquement en mode release
    Par Aymerik dans le forum MFC
    Réponses: 18
    Dernier message: 08/09/2006, 12h07
  2. [MFC] Bug Clistctrl
    Par lykim dans le forum MFC
    Réponses: 2
    Dernier message: 21/04/2006, 09h27
  3. [MFC] Problème de conversion CString vers Char *
    Par Darkenshin dans le forum MFC
    Réponses: 10
    Dernier message: 02/12/2005, 14h42
  4. [MFC] Bug avec win98
    Par Aradesh dans le forum MFC
    Réponses: 5
    Dernier message: 22/08/2005, 19h10
  5. Transformer un champ CHAR en décimal
    Par ALLB dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 19/07/2004, 13h59

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