bonjour
je repends en ce moment un projet qui �tait fait en C++ Builder pour le migrer sous Visual Studio 10.
Je butte actuellement sur des comportements du compilateur que je ne comprends pas. J'ai mis en commentaire les sources d'information utilis�es pour le codage. Elle concerne la s�quence de code ci dessous:
les erreurs portent sur les instructions gcnew et sur le Copy
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12 System::String^ VirtualPath; array<wchar_t>^ VirtualBuffer; size_t len; len = wcslen( (wchar_t*)wsDatabaseName.c_str()); VirtualPath = gcnew System::String; VirtualBuffer = gcnew array<wchar_t, (int) 1>; // le prototype décit dans msdn library: public: static void Copy( IntPtr source, array<wchar_t>^ destination, int startIndex, int length); // la description de la fonction dans msdn library: Copie des données d'un pointeur mémoire non managé dans un tableau de caractères managé. // suggestion du compilateur Marshal::Copy(cli::array<Type,dimension> ^,int,System::IntPtr,int) Marshal::Copy( VirtualBuffer, (Int32)0, (System::IntPtr)wsDatabaseName.c_str(), (Int32)len); VirtualPath = (System::String^)VirtualBuffer;
ci apr�s les messages d'erreur:
La premi�re est r�p�titive si je fais un gcnew avec comme type la String il me met syst�matiquement qu'il ne connait pas la System::String::String
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 1>..\..\..\..\DBMS\DBMSManager\src\InterbaseManager.cpp(355): error C2512: 'System::String::String'*: aucun constructeur par défaut approprié disponible 1>..\..\..\..\DBMS\DBMSManager\src\InterbaseManager.cpp(356): error C2748: La création de tableau managé doit posséder une taille de tableau ou un initialiseur de tableau 1>..\..\..\..\DBMS\DBMSManager\src\InterbaseManager.cpp(360): error C2440: 'cast de type'*: impossible de convertir de 'const wchar_t *' en 'System::IntPtr' 1> Aucun opérateur de conversion définie par l'utilisateur disponible qui puisse effectuer cette conversion, ou l'opérateur ne peut pas être appelé 1>..\..\..\..\DBMS\DBMSManager\src\InterbaseManager.cpp(361): error C2440: 'cast de type'*: impossible de convertir de 'cli::array<Type> ^' en 'System::String ^' 1> with 1> [ 1> Type=wchar_t 1> ] 1>..\..\..\..\DBMS\DBMSManager\src\InterbaseManager.cpp(475): error C2059: erreur de syntaxe*: ';' 1>..\..\..\..\DBMS\DBMSManager\src\InterbaseManager.cpp(516): warning C4244: 'argument'*: conversion de 'long' en 'short', perte possible de données 1>..\..\..\..\DBMS\DBMSManager\src\InterbaseManager.cpp(534): warning C4244: 'argument'*: conversion de 'long' en 'short', perte possible de données 1>
le deuxi�me est une interpr�tation de l'aide de Microsoft http://msdn.microsoft.com/fr-fr/library/ms146632 il me dit que l'array doit donner un type avec sa taille, selon les compilation il ajoute que la taille est comprise entre 1 et 32
le troisi�me message met en cause la syntaxe de la Copy qui est d�fini dans http://msdn.microsoft.com/fr-fr/library/ms146637
qui peut me donner les syntaxes accept�es par le compilateur
Partager