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 :

Problème avec CString.Format


Sujet :

MFC

  1. #1
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut Problème avec CString.Format
    Bonjour,

    Depuis 5 ans j'ai ce bout de code qui fonctionne sans souci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // fonction
    CString ToSQLString(CString sql)
    {
    	sql.Replace("'", "''");
    	sql.Format("'%s'", sql);
    	return sql;
    }
     
    //et dans le code appellant
    CString s = ToSQLString(CTime::GetCurrentTime().Format("%H%M%S"))
    jusqu'à present j'avais toujours
    s = '165517' // par exemple.

    Depuis aujourd'hui, la même fonction renvoit des fois
    s = ''''''''

    Quelqu'un a une explication?

  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
    Par défaut
    salut,
    ton projet n'est pas en UNICODE des fois ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je ne suis pas certain que ça compilerait si c'était le cas.

    Non, ça ressemble plus à un changement dans l'implémentation de la fonction CString::Replace()...
    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
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Citation Envoyé par farscape
    salut,
    ton projet n'est pas en UNICODE des fois ?
    Non. Jeu de caractère non défini

    Médinoc, sql.Replace retourne bien ce qu'il me faut.
    C'est sql.Format qui 'foire'. J'ai comme l'impression que faire sql.format("%s",sql) ne lui plait pas.

    Quand je passe par une étape intermédiare comme ci dessous, ça marche très bien.

    Exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CString ToSQLString(CString sql)
    {
    	CString s;
    	sql.Replace("'", "''");
    	s.Format("'%s'", sql);
    	return s;
    }
    Quelqu'un peu essayer chez lui les deux versions de ToSqlString avec le paramètre CTime::GetCurrentTime().Format("%H%M%S") ?

    Merci

  5. #5
    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
    Par défaut
    alors essaye plutôt ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    s.Format("'%s'",static_cast<const char *>( sql));

  6. #6
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    ça marche aussi ... tout comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CString ToSQLString(CString sql)
    {
    	CString s;
    	sql.Replace("'", "''");
    	s.Format("'%s'", sql);
    	return s;
    }
    C'est pareil.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    farscape: Ton code force la CString à forker, c'est ça ?

    En tout cas, je pense que le sql.Format("'%s'", sql) est un comportement aussi indéfini que sprintf(str, "%s", str) ---> Un truc à bannir, quoi...
    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.

  8. #8
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Citation Envoyé par Médinoc
    sprintf(str, "%s", str) ---> Un truc à bannir, quoi...
    C effectivement l'équivalent en C.

    Pourquoi c'est indéfini ce truc? C'est ça que j'aimerai comprendre.
    5 ans que l'appli tourne et boum d'un coup ça plante à cet endroit.

  9. #9
    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
    Par défaut
    c'est indefini à mon avis ,parce que format ou sprintf utilise une signature argument variable .
    comment dans ce contexte le compilo peut-il faire pour choisir l'operateur aproprié ?
    si je mets const char *, c'est pour forcer l'appel de l'operateur de la CString...

    ps:j'ai vu beaucoup de gens ne pas mettre le const char * dans ce contexte avec vc6 ,j'ai toujours pensé que c'était une erreur à ne pas faire ,et je me suis toujours demandé comment ça pouvait fonctionner ....

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Avec le sprintf(), tu lis et tu écris au même endroit, pire, tu INSERES des caractères. Ce qui me surprend, ce n'est pas que ça ne marche plus, mais que ça ait marché avant...

    Je suppose que CString::Format() fait plus ou moins la même chose si son buffer est assez grand pour qu'il n'ait pas à le réallouer...
    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.

  11. #11
    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
    Par défaut
    la difference avec format ,c'est qu'il y a une pre analyse des arguments pour estimer la longueur de la chaine à allouer.

  12. #12
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Ok Merci ... et à l'année prochaine

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

Discussions similaires

  1. Problème avec CString::Format
    Par wajdi86 dans le forum MFC
    Réponses: 2
    Dernier message: 21/09/2011, 15h17
  2. Problème avec les Formats de Date
    Par sebac dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 08/01/2008, 15h30
  3. Problème avec le format des décimaux
    Par layouni dans le forum Framework .NET
    Réponses: 1
    Dernier message: 14/02/2007, 13h43
  4. Problème avec le format HTML pendant le parsing
    Par hatemnafti dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 28/11/2006, 10h54
  5. Problème avec CString
    Par emric591 dans le forum C++
    Réponses: 7
    Dernier message: 15/11/2006, 16h16

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