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++Builder Discussion :

CB2010: erreur SaveDialog1->FileName.c_str()


Sujet :

C++Builder

  1. #1
    Membre éclairé
    Homme Profil pro
    Chercheur génie électrique
    Inscrit en
    Mai 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur génie électrique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 263
    Par défaut CB2010: erreur SaveDialog1->FileName.c_str()
    Bonjour,
    je passe un projet de CBuilder2006 en 2010, voici une erreur
    Erreur : E2034 Impossible de convertir 'wchar_t *' en 'const char *'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FILE* askDATFile = fopen(SaveDialog1->FileName.c_str(),"r");
    Merci par avance de votre aide

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 067
    Par défaut
    utilise w_str() ou fopenA (si ça existe)
    Bon Courage pour la Migration UniCode !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre éclairé
    Homme Profil pro
    Chercheur génie électrique
    Inscrit en
    Mai 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur génie électrique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 263
    Par défaut
    Merci.
    J'ai essayé w_str(), cela ne marche pas.

    En cherchant un peu, il parait que AnsiString n'est plus compatible dans CBD2010!!!

    Voici quelques détails pour la migration d'une de mes appli vers C++Builder2010 avec réussite:

    1. Remplacer tous AnsiString par String
    2. Remplacer tous .c_str() par .t_str() car .c_str() n’est pas supporté par UnicoleString
    3. Pour la fonction pow(): pow(3, 2) doit être pow(3., 2) dans CBD2010

    Une question: quelle est la différence entre AnsiString et String!

    Merci

  4. #4
    Membre éclairé
    Homme Profil pro
    Chercheur génie électrique
    Inscrit en
    Mai 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur génie électrique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 263
    Par défaut
    Il y a encore un problème:
    chaque fois que j'utilise MyString.t_str(), le contenu de MyString est modifié!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char p[512];
    String MyString = "Test";
    strcpy(p, MyString.t_str());

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 067
    Par défaut
    Citation Envoyé par Xavier Voir le message
    Une question: quelle est la différence entre AnsiString et String!
    Faudrait se renseigner peut-être ! non ?
    Cela fait au moins 3 ans que l'on en parle, les Code Way Tour sont là pour informer les développeurs, Thierry Laborde a bien insisté sur l'importance de la migration ANSI vers UniCode, l'impact sur les libs externes et la supposition eronnée de la taille d'un caractère vaut 1 (cela peut être 2 en UniCodeString ou 1 à 4 en UTF8String)

    Depuis RAD 2009, le type String est devenu un alias pour UnicodeString, c'est probablement la modification majeur du RAD Studio de ces dernières années !
    Voir aussi RawByteString

    Je n'ai pas 2010 sur mon poste, je n'ai que 2007, mon XE est sur un autre ordi ... donc je n'ai pas t_str()

    Attention à ne pas mélanger des fonctions ANSI et UniCode !
    attention char = ANSI, Char = UniCode (faut vérifier quelques options et directives aussi)
    typiquement "strcpy" va être en "char" alors que StrCopy en "Char", note la subtilité sizeof(char) != sizeof(Char) selon les directives de compilation, il me semble ?!
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre éclairé
    Homme Profil pro
    Chercheur génie électrique
    Inscrit en
    Mai 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur génie électrique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 263
    Par défaut
    Merci pour ces détails. Franchement, j'ai créé quelques applis sans vraiment connaître l'informatique.
    Une petite question : je bascule mes applis en CBD2010 pour une bonne fois, je dois convertir les AnsiString en UnicodeString ou en String ?
    Merci

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 067
    Par défaut
    La bascule est toujours problématique !
    Disons que le type String aura l'avantage d'être compatible avec la VCL !

    2006 : String = AnsiString
    2010 : String = UnicodeString

    String n'était qu'un alias, fort pratique d'ailleurs, si tu as massivement utilisé la AnsiString explicitement, il est évident que tu vas avoir des conflits !

    fait bien attention aussi au fonctions que tu utilises !

    pour le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char p[512];
    String MyString = "Test";
    strcpy(p, MyString.t_str());
    char => 1 octet
    MyString "Test" => 10 octets, T 0 e 0 s 0 t 0 0 0
    finalement strcpy va copier juste T puisqu'il Ansi et le second octet de l'UniCode pour lui est un zéro terminal (ce qui est faux bien sur !)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre éclairé
    Homme Profil pro
    Chercheur génie électrique
    Inscrit en
    Mai 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur génie électrique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 263
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    La bascule est toujours problématique !
    Disons que le type String aura l'avantage d'être compatible avec la VCL !

    2006 : String = AnsiString
    2010 : String = UnicodeString

    String n'était qu'un alias, fort pratique d'ailleurs, si tu as massivement utilisé la AnsiString explicitement, il est évident que tu vas avoir des conflits !

    fait bien attention aussi au fonctions que tu utilises !

    pour le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char p[512];
    String MyString = "Test";
    strcpy(p, MyString.t_str());
    char => 1 octet
    MyString "Test" => 10 octets, T 0 e 0 s 0 t 0 0 0
    finalement strcpy va copier juste T puisqu'il Ansi et le second octet de l'UniCode pour lui est un zéro terminal (ce qui est faux bien sur !)
    Merci tes explications.
    Pour le code ci-dessus, « Test » a été correctement copié dans p. Le problème est que le contenu de MyString n’est plus « Test » : deux caractères illisibles (Unicode ?). C’est à dire que strcpy() a modifié MyString.

    En cherchant sur internet, la modification ci-dessous permet de copier correctement le contenu et garder MyString. Cependant, cette solution est onéreuse comme j’en ai beaucoup à faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char p[512];
    String MyString = "Test";
    strcpy(p, AinsiStrin(MyString).c_str());

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 067
    Par défaut
    "MyString.t_str()" cela renvoie quoi ? je ne l'ai pas cette méthode
    as-tu testé d'appeler juste "t_str()" genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* truc =  MyString.t_str();
    est-ce que cela modifie le contenu de la chaine ? à mon avis non !
    que dit l'aide sur cette fonction ?

    strcpy est une fonction ANSI ou Unicode ? Quel est son prototype ?
    si il arrive a copier c'est surprenant ou alors il y a une conversion ? est-ce t_str() ?

    si tu as le contenu qui change, est-ce que strcpy modifie le pointeur que l'on lui passe (un pointeur const ça ne devrait pas !)
    regarde ce qu'il y a dans la chaine, bidouille un truc genre char*(int(data)-10))

    tu devrais utiliser StrCopy de la VCL

    idem, fopen, regarde si tu as des variantes _wfopen, wfopen, fopenw ... mais tu pourrais le remplacer par un TFileStream ! en C++ Builder, il faut utiliser le plus que possible la VCL, sinon aucun intérêt d'utiliser cet IDE !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre éclairé
    Homme Profil pro
    Chercheur génie électrique
    Inscrit en
    Mai 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur génie électrique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 263
    Par défaut
    Merci ShaiLeTroll ; char* truc = MyString.t_str() fonctionne parfaitement. Je suis obligé de remplacer les « fopen » par « _wfopen ».
    En effet, j’ai utilisé les « fopen » dans une ancienne application, à chaque mise à niveau depuis 15ans, j’ai essayé de garder cette méthode pour éviter le temps de teste et de vérification. Tu as raison, tôt ou tard, il faut que je utilise davantage VCL. C’est laborieux, mais il faut le faire et il faut me mettre dans le bain de Unicode.
    Cordialement

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

Discussions similaires

  1. [ODS] Erreur dans une instruction filename
    Par mohamed_ dans le forum ODS et reporting
    Réponses: 5
    Dernier message: 27/09/2011, 18h03
  2. erreur imread:(strfind(filename, '://'))
    Par matlabeginer dans le forum Images
    Réponses: 3
    Dernier message: 25/04/2008, 11h25
  3. Relation Savedialog1.Filename entre 2 form?
    Par qhardy dans le forum Débuter
    Réponses: 7
    Dernier message: 26/02/2008, 16h22
  4. erreur IDL:omg.org/CORBA/MARSHAL:1.0
    Par Pinggui dans le forum CORBA
    Réponses: 3
    Dernier message: 13/05/2002, 15h05
  5. [Kylix] Erreur objet
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h41

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