Meilleur auteur de réponses
addreser un tableau

Question
-
J'ai codé:
array< System::Char^> exe_fps[NUMPARTS+1];
et le compilateur m'a répondu:
1>D:\usr\Specification LoaderV4.1\dev\ALN_Kernel\make\SpecificationLoader\SpecificationLoader\WnRtl.hpp(20): error C2728: 'cli::array<Type>' : un tableau natif ne peut pas contenir ce type managé 1> with 1> [ 1> Type=System::Char ^ 1> ] 1> Voulez-vous utiliser 'array<cli::array<Type>>' ? 1> with 1> [ 1> Type=System::Char ^ 1> ] 1>D:\usr\Specification LoaderV4.1\dev\ALN_Kernel\make\SpecificationLoader\SpecificationLoader\WnRtl.hpp(20): error C4368: impossible de définir 'exe_fps' comme membre de 'SpecificationLoader::WnRtl' managé : les types mixtes ne sont pas pris en charge
qui m'aidera
J'ai donc reporté la modification de exe_fps dans la classe CMorph:
#ifndef CMorph_H #define CMorph_H namespace SpecificationLoader { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::IO; ref class CMorph { public: array< System::Char^>^ exe_fps; CMorph::CMorph(); CMorph::~CMorph(); static int CMorph::morphinit(void); /* Close exception list files and reopen */ static int CMorph::re_morphinit(); /* Try to find baseform (lemma) of word or collocation in POS. */ static char *CMorph::morphstr(char *, int); /* Try to find baseform (lemma) of individual word in POS. */ static char *CMorph::morphword(char *, int); static int CMorph::do_init(void); static char* CMorph::strtolower( char *str); private: static char* CMorph::WsCanonWord( int offset, int count, int pos, char* word, char* end); static int CMorph::strend(char *str1, char *str2); static char* CMorph::WordBase(char *word, int ender); static int CMorph::hasprep(char *s, int wdcnt); static char *CMorph::exc_lookup(char *word, int pos); static char *CMorph::morphprep(char *s); }; }; #endif
et j'essaie de l'adresser dans les méthodes de CMorph:
int CMorph::re_morphinit(void) { int i; for (i = 1; i <= NUMPARTS; i++) { if( CMorph::exc_fps[i] != NULL) { fclose( exc_fps[i]); exc_fps[i] = NULL; } } return(OpenDB ? do_init() : -1); }
a quoi le compilateur répond:
1>..\..\..\..\..\..\WordNet\src\lib\morph.cpp(139): error C2039: 'exc_fps' : n'est pas membre de 'SpecificationLoader::CMorph' 1> D:\usr\WordNet\src\include\Morph.h(15) : voir la déclaration de 'SpecificationLoader::CMorph' 1>..\..\..\..\..\..\WordNet\src\lib\morph.cpp(139): error C2065: 'exc_fps' : identificateur non déclaré 1>..\..\..\..\..\..\WordNet\src\lib\morph.cpp(141): error C2065: 'exc_fps' : identificateur non déclaré 1>..\..\..\..\..\..\WordNet\src\lib\morph.cpp(142): error C2065: 'exc_fps' : identificateur non déclaré
puis j'ai codé: à noter que j'ai besoin de déclarer un tableau de FILE*
static array<FILE>^ exc_fps;
et le compilateur à répondu
1>D:\usr\WordNet\src\include\Morph.h(17): error C2691: 'FILE' : un tableau managé ne peut pas avoir ce type d'élément
à noter que le compilateur refuse aussi FILE^
mais la déclaration suivante pose moins de problèmes
static array<FILE*, 1>^ exc_fps;
bien que le compilateur réponde:
1>D:\usr\WordNet\src\include\Morph.h(17): error C2691: 'FILE' : un tableau managé ne peut pas avoir ce type d'élément
Jean Noël Martin
- Modifié JeanNoel53 mercredi 7 octobre 2015 05:31
Réponses
-
>pourtant il faut un FILE** avec cette primitive
Ok, alors mettez des FILE** dans exc_fps. Quitte à l'escroquer avec des *, autant y aller franco avec **.
static array<FILE**, 1>^ exc_fps;
...
if (( fopen_s(exc_fps[i], fname, "r")) == NULL)
L'utilisation de conteneurs managés avec des FILE n'a aucun sens.(BIS)
Paul Bacelar, Ex - MVP VC++
- Marqué comme réponse Paul BacelarModerator mercredi 7 octobre 2015 12:08
Toutes les réponses
-
Les Array .NET ne sont pas des tableau C.
https://msdn.microsoft.com/en-us/library/dtbydz1t.aspx?f=255&MSPPError=-2147217396
"exc_fps" c'est différent de "exe_fps"
FILE, c'est un machin C (même pas C++), aucune chance de mettre cette horreur dans un Array .NET.
Paul Bacelar, Ex - MVP VC++
-
pourtant la même déclaration est accepté par le compilateur pour l'ensemble des utilisations de exc_fps
sauf la suivante
if (( fopen_s( (FILE**)&exc_fps[i], fname, "r")) == NULL)
qui donne
1>..\..\..\..\..\..\WordNet\src\lib\morph.cpp(210): error C2440: 'cast de type' : impossible de convertir de 'cli::interior_ptr<Type>' en 'FILE **' 1> with 1> [ 1> Type=FILE * 1> ] 1> Impossible de convertir un type managé en type non managé 1>
Jean Noël Martin
-
On n'a pas la déclaration de "exc_fps", on n'est pas devin.
Et "FILE, c'est un machin C (même pas C++)" (BIS), vous ne pouvez pas caster un pointeur de référence managé en un pointeur de pointeur de FILE.
Là, vous écrivez du "petit nègre", faudrait un peu réfléchir à ce que vous écrivez, au moins un peu.
P.S.: votre code, c'est bien plus du C que du C++.
Paul Bacelar, Ex - MVP VC++
-
la déclaration est ci dessous(bis)
static array<FILE*, 1>^ exc_fps;
elle est accepté par le compilateur
je convertit du code C de WordNet en C++ Managé a prix minimum
j'ai essayé
if (( fopen_s( (FILE**)%(exc_fps[i]), fname, "r")) == NULL)
et le compilateur à répondu:
1>..\..\..\..\..\..\WordNet\src\lib\morph.cpp(210): error C3071: l'opérateur '%' ne peut être appliqué qu'à une instance d'une classe ref ou d'un type valeur
Jean Noël Martin
- Modifié JeanNoel53 mardi 6 octobre 2015 17:00
-
>elle est accepté par le compilateur
Tu a juste "escroqué" le compilateur en ajoutant un * pour le traiter comme un int.
Ça ne passe pas avec :
if (( fopen_s( exc_fps[i], fname, "r")) == NULL)
???
L'utilisation de conteneurs managés avec des FILE n'a aucun sens.
Paul Bacelar, Ex - MVP VC++
-
pourtant il faut un FILE** avec cette primitive
J'ai également essayé avec:
if (( fopen_s( (FILE**)&(%exc_fps[i]), fname, "r")) == NULL)
et le compilateur à répondu:
1>..\..\..\..\..\..\WordNet\src\lib\morph.cpp(210): error C3071: l'opérateur '%' ne peut être appliqué qu'à une instance d'une classe ref ou d'un type valeur
1>..\..\..\..\..\..\WordNet\src\lib\morph.cpp(210): error C2102: '&' nécessite une l-value
Jean Noël Martin
- Modifié JeanNoel53 mardi 6 octobre 2015 17:06
-
>pourtant il faut un FILE** avec cette primitive
Ok, alors mettez des FILE** dans exc_fps. Quitte à l'escroquer avec des *, autant y aller franco avec **.
static array<FILE**, 1>^ exc_fps;
...
if (( fopen_s(exc_fps[i], fname, "r")) == NULL)
L'utilisation de conteneurs managés avec des FILE n'a aucun sens.(BIS)
Paul Bacelar, Ex - MVP VC++
- Marqué comme réponse Paul BacelarModerator mercredi 7 octobre 2015 12:08
-
-
-
par ce qu'elle sont tous de ce type là:
int CMorph::re_morphinit(void) { int i; for (i = 1; i <= NUMPARTS; i++) { if( exc_fps[i] != nullptr) { fclose( exc_fps[i]); exc_fps[i] = NULL; } } return(OpenDB ? do_init() : -1); }
je vais cependant essayer FILE** et *exc_fps[i];
Ça marche
Jean Noël Martin
- Modifié JeanNoel53 mercredi 7 octobre 2015 06:13
- Marqué comme réponse JeanNoel53 mercredi 7 octobre 2015 06:13
- Non marqué comme réponse Paul BacelarModerator mercredi 7 octobre 2015 12:08