Bonjour
j'ai lu les différentes contributions sur ce sujet sans toujours faire les mêmes constatations que mes prédécesseurs. Je rapporte ici un cas surprenant de divergences de comportement du même code entre deux projets différents que j’appellerai ANCIEN et NOUVEAU. la raison est que ANCIEN est un projet existant développé sous C++6 tandis que nouveau a été créé sous C++9. Les deux projets sont cependant executés sous C++9. L'ANCIEN a donc été converti automatiquement par le RAD.
Je précise que j'ai bien sûr essayé de faire varier la fameuse option "Mappage du _TCHAR" sans que cela fasse varier les observations suivantes :
Prenons le code inoffensif et fonctionnel sous C++ Builder 6
il ne se compile pas sous C++Builder 9 à cause du c_str(). Je le remplace donc par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 MessageBox(Application->Handle, (Format("%s ",ARRAYOFCONST(("Toto")))).c_str(), "Erreur", MB_OK | MB_ICONERROR);
La compilation passe ... mais à l’exécution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 MessageBox(Application->Handle, (Format("%s ",ARRAYOFCONST(("Toto")))).t_str(), "Erreur", MB_OK | MB_ICONERROR);
le projet NOUVEAU affichele projet ANCIEN afficheTotoJe présume que l'ouverture/conversion d'un projet C++6 sous C++9 entraîne quelques choix d'options qui expliqueraient ce comportement. Néanmoins je ne vois pas lesquelles ?????
Après quelques recherches sur le forum je tente
qui fonctionne depuis les deux projets.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 MessageBox(Application->Handle, AnsiString().Format("%s ",ARRAYOFCONST(("Toto"))).c_str(), "Erreur", MB_OK | MB_ICONERROR);
Je pense à la lecture de la doc) que la fonction Format est surchargée, et que par conséquent ce n'est pas le même code qui est compilé dans les deux projets. Mais comment savoir quelle déclinaison est employée ?
D'ordinaire la discrimination de fonctions surchargées se fait par les paramètres d'appel. Mais ici ce sont les mêmes. Je pense aussi à l'inclusion automatique si elle se fait sur les composants visuels, elle n'a pas lieu sur de simples fonctions même de classe... ?
NB : j'ai réédité ce message après relecture car j'ai constaté après une nuit de sommeil qu'il était incompréhensible en l'état. Désolé pour ceux qui l'ont lu avant la mise à jour...
Partager