none
addreser un tableau RRS feed

  • 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
    mardi 6 octobre 2015 08:21

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++

    mardi 6 octobre 2015 17:19
    Modérateur

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++

    mardi 6 octobre 2015 13:21
    Modérateur
  • 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

    mardi 6 octobre 2015 13:29
  • 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++

    mardi 6 octobre 2015 14:12
    Modérateur
  • 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



    mardi 6 octobre 2015 16:37
  • >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++

    mardi 6 octobre 2015 16:59
    Modérateur
  • 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


    mardi 6 octobre 2015 17:04
  • >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++

    mardi 6 octobre 2015 17:19
    Modérateur
  • je pense que l'escroquerie que vous proposez ne marchera pas sur les autres instances  de exc_fps

    Jean Noël Martin

    mardi 6 octobre 2015 17:51
  • Why ???

    Paul Bacelar, Ex - MVP VC++

    mardi 6 octobre 2015 18:13
    Modérateur
  • 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



    mercredi 7 octobre 2015 05:30