Bonjour,
je passe un projet de CBuilder2006 en 2010, voici une erreur
Erreur : E2034 Impossible de convertir 'wchar_t *' en 'const char *'
Merci par avance de votre aideCode:
1
2 FILE* askDATFile = fopen(SaveDialog1->FileName.c_str(),"r");
Version imprimable
Bonjour,
je passe un projet de CBuilder2006 en 2010, voici une erreur
Erreur : E2034 Impossible de convertir 'wchar_t *' en 'const char *'
Merci par avance de votre aideCode:
1
2 FILE* askDATFile = fopen(SaveDialog1->FileName.c_str(),"r");
utilise w_str() ou fopenA (si ça existe)
Bon Courage pour la Migration UniCode !
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
Il y a encore un problème:
chaque fois que j'utilise MyString.t_str(), le contenu de MyString est modifié!
Code:
1
2
3 char p[512]; String MyString = "Test"; strcpy(p, MyString.t_str());
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 ?!
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
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
char => 1 octetCode:
1
2
3 char p[512]; String MyString = "Test"; strcpy(p, MyString.t_str());
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:
1
2
3 char p[512]; String MyString = "Test"; strcpy(p, AinsiStrin(MyString).c_str());
"MyString.t_str()" cela renvoie quoi ? je ne l'ai pas cette méthode
as-tu testé d'appeler juste "t_str()" genre
est-ce que cela modifie le contenu de la chaine ? à mon avis non !Code:char* truc = MyString.t_str();
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 !
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