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