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 :

Bug de CString ? ou mauvaise utilisation !


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 85
    Points : 43
    Points
    43
    Par défaut Bug de CString ? ou mauvaise utilisation !
    Bonjour,

    J'ai affaire à un drôle de bug lorsque j'utilise la classe CString et surtout lorsque celle-ci fait appel à l'opérator+ visiblement.
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CString Query="UPDATE "+m_Tables+" SET ";		
    for(int i=0;i<(int)m_pFX.m_TableauColonnes.m_nbElem;i++)
    		{
    			if(i==40)
    				i=40;
    			Query=Query+m_pFX.m_TableauColonnes.m_pTabString[i]+CString(" = '")+m_pFX.m_TableauValeurs.m_pTabString[i]+CString("',");
     
    		}
    Je m'explique : le if(i==40) me permet juste d'avoir un point d'arrêt à cet endroit car c'est à ce moment que la recopie ne se passe pas comme il faut.
    Lorsque j'ajoute le dernier element, la variable Query qui avait accumulé toutes mes chaines repassent à la valeur "". Pourtant je ne fais que des concaténations...
    Est ce que quelqu'un aurait une idée là dessus ?

  2. #2
    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
    salut,
    attention en debug trace la visualisation de la CString est limitée a 256 caractéres (du moins avec vc6.0).
    pour visualiser la chaine il vaut mieux faire un AfxMessageBox et ne pas inspecter la variable en mode trace..
    Sinon la vérité est ailleurs, la CString fonctionne très bien sans bug connu .
    je m'en suis déjà servi dans le même contexte que toi ( la génération d'une requete SQL) sans problème.
    quel est la nature de l'objet m_pTabString,il ne faudrait pas faire * ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 85
    Points : 43
    Points
    43
    Par défaut
    Ah, ça je ne le savais pas... Mais est ce que ça explique le remplacement complet de ma chaine de caractère par une chaine vide à la dernière concaténation ? Par ce que si c'était limité à 256 caractères, j'arriverai normalement à suivre la trace des 256 premiers caractères et non pas une chaine vide ?

    edit : m_pTabString[i] est un tableau de CString donc normalement pas de déférencement... Et puis ça marche pour les premières chaines alors je vois pas pourquoi ça ne marcherai pas pour la 40eme chaine

  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
    Citation Envoyé par globule71
    Ah, ça je ne le savais pas... Mais est ce que ça explique le remplacement complet de ma chaine de caractère par une chaine vide à la dernière concaténation ? Par ce que si c'était limité à 256 caractères, j'arriverai normalement à suivre la trace des 256 premiers caractères et non pas une chaine vide ?
    non ça n'explique pas tout, mais tu n'as pas repondu à
    quel est la nature de l'objet m_pTabString,il ne faudrait pas faire * ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 85
    Points : 43
    Points
    43
    Par défaut
    Desolé j'avais pas vu ta dernière question

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 85
    Points : 43
    Points
    43
    Par défaut
    Bon j'ai tenté d'arrêter la recopie dans la boucle du for juste avant la dernière chaine pour récupérer une chaine remplie... et j'ai esseyé de remplir avec le dernier element hors de la boucle : mais cette fois ci ça plante méchamment sur l'operator+ qui reçoit en paramètre un pointeur de la chaine à concaténer ainsi que.... un pointeur vide !
    Visiblement à l'appel de l'opérator+ je perds carrément le pointeur du CString
    Pour t'as question si t'as pas vu le edit du dessus j'ai bien un tableau de CString avec le m_pTabString

  7. #7
    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
    je peux voir la declaration ?
    si tu es hors indices ça plante.
    il vaut mieux utiliser un CArray<CString ,const char *> pour le tableau et utiliser la fonction GetCount() du CArray pour avoir la taille et iterer...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 85
    Points : 43
    Points
    43
    Par défaut
    ouhla je suis mal barré si je dois refondre la classe de mon collègue...
    Bon j'ai réussi à contourner le probleme une fois... Dans les requetes il y avait des espaces je les ai supprimés vu qu'on en a pas besoin pour les requètes sql du coup ça ne plante plus au même endroit mais plus loin dans le même type de boucle par contre là la technique du "je supprime les espaces " ne marche pas lol
    Bon pour les déclarations je suis un peu pommé je vais voir comment il les déclare mais bon normalement j'avais pas trop à toucher à sa classe

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 85
    Points : 43
    Points
    43
    Par défaut
    Au passage ça ne plante pas sur une histoire d'indice mais bel et bien bcp plus tard lorsque j'ai besoin de cette chaine qui normalement doit être remplie mais se retrouve vide !
    C'est vraiment lors de la concaténation que ça plante et je vérifie bien ce que je concatène : ça n'est pas vide du tout ! Mais ce qui est bizarre c'est que l'operator+ n'arrive pas à chopper les paramètres qui lui sont passés au bout d'un moment (surtout l'ancienne chaine ...)

  10. #10
    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
    si tu debordes au niveau de l'indice tu planteras l'operation + .
    tant que l'on ne sera pas de quoi on parle au niveau de cette variable tableau on ne pourra rien dire de plus...

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 85
    Points : 43
    Points
    43
    Par défaut
    Voilà en creusant plus loin j'atteris ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	friend CStringT operator+( __in const CStringT& str1, __in const CStringT& str2 )
    	{
    		CStringT strResult( str1.GetManager() );
     
    		Concatenate( strResult, str1, str1.GetLength(), str2, str2.GetLength() );
     
    		return( strResult );
    	}
    A savoir : str1 et str2 sont bien remplie comme il faut mais lors de l'opération concatenate celle ci ne rempli pas strResult comme il faut (il devrait y avoir une chaine remplie et non une chaine vide ("")

  12. #12
    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
    je le redis encore la faute n'est pas sur CString mais de ton environnement, tes chaines ne doivent pas être valide.
    vérifie la taille physique de ton tableau .

Discussions similaires

  1. Vilain bug ou mauvaise utilisation de ma part ?
    Par ForgetTheNorm dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 03/04/2008, 16h39
  2. Mauvaise utilisation des ressources [DATAWARE HOUSE]
    Par bvincent dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/06/2007, 12h28
  3. mauvaise utilisation de having ?
    Par maysa dans le forum Langage SQL
    Réponses: 4
    Dernier message: 01/06/2007, 16h48
  4. Bug ou mauvaise utilisation des FileUpload?
    Par mael94420 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 03/05/2007, 09h13
  5. Mauvaise utilisation d'une DLL ?
    Par _SamSoft_ dans le forum C
    Réponses: 6
    Dernier message: 21/02/2007, 00h14

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