none
déclarer un tableau de chaines RRS feed

  • Question

  • bonjour

    je dois déclarer un tableau de chaines. J'ai codé :

    array<System::String^, 1> sDocType[NUMBER_OF_DOCTYPE] = {L"", L"Word Document",
    	  L"HTML Document", L"XML Document"};
    et le compilateur me répond :
    1>..\..\..\..\Common\src\Document.cpp(54): error C2728: 'cli::array<Type,dimension>' : un tableau natif ne peut pas contenir ce type managé
    


    Jean Noël Martin

    mardi 14 juillet 2015 20:10

Réponses

Toutes les réponses

  • Je ne peux que paraphraser le compilateur

    "un tableau natif ne peut pas contenir ce type managé".


    Paul Bacelar, Ex - MVP VC++


    mercredi 15 juillet 2015 01:44
    Modérateur
  • mais que faire?

    Jean Noël Martin

    mercredi 15 juillet 2015 07:01
  • C'est un doux mélange de tableau à la C ( [NUMBER_OF_DOCTYPE]), de C++/CLI ( cli::array<....>) et de C++11 ( initialisation avec des {...}).

    Le compilateur essaye donc de créer un tableau C de [NUMBER_OF_DOCTYPE] élément, contenant chacun un cli::array<....>. Je ne crois pas que c'est votre objectif.


    Paul Bacelar, Ex - MVP VC++

    jeudi 16 juillet 2015 08:34
    Modérateur
  • J'ai doc repris le code :

    /*******************************************************************************
    * FILE NAME: Document.cpp
    * PURPOSE:   This file contains implementation of the methods of
    *            CDocType class.
    * HISTORY:
    * Date        Version                   Author
    * 12/06/2003  initial version :1.0      Vivek
    *******************************************************************************/
    //--------------------------- INCLUDE-FILES ------------------------------------
    #include "StdAfx.h"
    #include <vcclr.h>
    #using <mscorlib.dll>
    #include "IBPP.h"
    #include "AlignStructure.h"
    #include "Macro.h"
    #include "Message.h"
    #include "EnumerationM.hpp"
    #include "StructureM.h"
    #include "TypeDefsM.hpp"
    #include "POSM.h"
    #include "LinkDescription.h"
    #include "ClasseAlignerManaged.hpp"
    #include "LinkDescription.h"
    #include "Document.h"
    //----------------------------GLOBAL DATA---------------------------------------
    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;
    //----------- METHOD IMPLEMENTATION OF CDocType Class --------------------------
    	CDocType::CDocType()
    	{
    	};
    
    	CDocType::~CDocType()
    	{
    	};
    
    	std::wstring CDocType::EnumToStr( enDocTypeM Document)
    	{
    	  std::wstring sDocType[enDocTypeM::NUMBER_OF_DOCTYPE] = {L"", L"Word Document",
    	  L"HTML Document", L"XML Document"};
    
    	  return sDocType[Document];
    	};
    
    	enDocTypeM CDocType::StrToEnum( System::String^ sDocument)
    	{
    	  cli::array<void *, 1> sDocTypeM[enDocTypeM::NUMBER_OF_DOCTYPE] = {L"", L"Word Document",
    	  L"HTML Document", L"XML Document"};
    	  unsigned int iDoc = enDocTypeM::NUMBER_OF_DOCTYPE;
    
    	  while (--iDoc > DOCTYPE_NONE && sDocType[iDoc] != sDocument);
    
    	  return (enDocTypeM)iDoc;
    	};
    };
    //------------------------------------------------------------------------------
    

    et il donne le rapport d'erreur suivant

    1>..\..\..\..\Common\src\Document.cpp(46): warning C4482: extension non standard utilisée : enum 'enDocTypeM' utilisé dans le nom qualifié
    1>..\..\..\..\Common\src\Document.cpp(54): warning C4482: extension non standard utilisée : enum 'enDocTypeM' utilisé dans le nom qualifié
    1>..\..\..\..\Common\src\Document.cpp(54): error C2728: 'cli::array<Type,dimension>' : un tableau natif ne peut pas contenir ce type managé
    1>          with
    1>          [
    1>              Type=void *,
    1>              dimension=1
    1>          ]
    1>          Voulez-vous utiliser 'array<cli::array<Type,dimension>>' ?
    1>          with
    1>          [
    1>              Type=void *,
    1>              dimension=1
    1>          ]
    1>..\..\..\..\Common\src\Document.cpp(54): error C2440: 'initialisation' : impossible de convertir de 'const wchar_t [1]' en 'cli::array<Type,dimension>'
    1>          with
    1>          [
    1>              Type=void *,
    1>              dimension=1
    1>          ]
    1>..\..\..\..\Common\src\Document.cpp(54): error C2440: 'initialisation' : impossible de convertir de 'const wchar_t [14]' en 'cli::array<Type,dimension>'
    1>          with
    1>          [
    1>              Type=void *,
    1>              dimension=1
    1>          ]
    1>..\..\..\..\Common\src\Document.cpp(55): error C2440: 'initialisation' : impossible de convertir de 'const wchar_t [14]' en 'cli::array<Type,dimension>'
    1>          with
    1>          [
    1>              Type=void *,
    1>              dimension=1
    1>          ]
    1>..\..\..\..\Common\src\Document.cpp(55): error C2440: 'initialisation' : impossible de convertir de 'const wchar_t [13]' en 'cli::array<Type,dimension>'
    1>          with
    1>          [
    1>              Type=void *,
    1>              dimension=1
    1>          ]
    1>..\..\..\..\Common\src\Document.cpp(56): warning C4482: extension non standard utilisée : enum 'enDocTypeM' utilisé dans le nom qualifié
    1>..\..\..\..\Common\src\Document.cpp(58): error C2065: 'sDocType' : identificateur non déclaré
    1>..\..\..\..\Common\src\Document.cpp(58): fatal error C1903: impossible de récupérer à partir des erreurs précédentes ; arrêt de la compilation
    1>


    Jean Noël Martin

    jeudi 16 juillet 2015 17:16
  • cli::array<void *, 1> sDocTypeM[enDocTypeM::NUMBER_OF_DOCTYPE] = {L"", L"Word Document",
    	  L"HTML Document", L"XML Document"};

    C'est toujours un aussi gros mélange de nimportenawak.

    Qu'est que vous essayez de faire là ???

    Un tableau C (donc natif) de enDocTypeM::NUMBER_OF_DOCTYP élément, contenant chacun un tableau managé à une dimension, contenant des void* (nimportenawak!!!).

    Le code suivant :

    std::wstring sDocType[enDocTypeM::NUMBER_OF_DOCTYPE] = {L"", L"Word Document",
    	  L"HTML Document", L"XML Document"};

    est beaucoup plus rationnel : Un tableau C (donc natif) de enDocTypeM::NUMBER_OF_DOCTYP élément, contenant chacun une std::wstring donc natif, et chacun des élément du tableau est initialisé par une des valeur séparée par des virgules (en profitant du fait qu'il existe un constructeur de std::wstring qui prend en paramètre une CWSTR.


    Paul Bacelar, Ex - MVP VC++

    jeudi 16 juillet 2015 18:11
    Modérateur
  • J'ai toujours des messages d'erreur :

    1>..\..\..\..\Common\src\Document.cpp(46): warning C4482: extension non standard utilisée : enum 'enDocTypeM' utilisé dans le nom qualifié
    1>..\..\..\..\Common\src\Document.cpp(52): warning C4482: extension non standard utilisée : enum 'enDocTypeM' utilisé dans le nom qualifié
    1>..\..\..\..\Common\src\Document.cpp(52): error C2728: 'cli::array<Type,dimension>' : un tableau natif ne peut pas contenir ce type managé
    1>          with
    1>          [
    1>              Type=wchar_t *,
    1>              dimension=1
    1>          ]
    1>          Voulez-vous utiliser 'array<cli::array<Type,dimension>>' ?
    1>          with
    1>          [
    1>              Type=wchar_t *,
    1>              dimension=1
    1>          ]
    1>..\..\..\..\Common\src\Document.cpp(52): error C2440: 'initialisation' : impossible de convertir de 'const wchar_t [1]' en 'cli::array<Type,dimension>'
    1>          with
    1>          [
    1>              Type=wchar_t *,
    1>              dimension=1
    1>          ]
    1>..\..\..\..\Common\src\Document.cpp(52): error C2440: 'initialisation' : impossible de convertir de 'const wchar_t [14]' en 'cli::array<Type,dimension>'
    1>          with
    1>          [
    1>              Type=wchar_t *,
    1>              dimension=1
    1>          ]
    1>..\..\..\..\Common\src\Document.cpp(52): error C2440: 'initialisation' : impossible de convertir de 'const wchar_t [14]' en 'cli::array<Type,dimension>'
    1>          with
    1>          [
    1>              Type=wchar_t *,
    1>              dimension=1
    1>          ]
    1>..\..\..\..\Common\src\Document.cpp(52): error C2440: 'initialisation' : impossible de convertir de 'const wchar_t [13]' en 'cli::array<Type,dimension>'
    1>          with
    1>          [
    1>              Type=wchar_t *,
    1>              dimension=1
    1>          ]
    1>..\..\..\..\Common\src\Document.cpp(53): warning C4482: extension non standard utilisée : enum 'enDocTypeM' utilisé dans le nom qualifié
    1>..\..\..\..\Common\src\Document.cpp(54): error C2065: 'sDocType' : identificateur non déclaré
    1>..\..\..\..\Common\src\Document.cpp(54): fatal error C1903: impossible de récupérer à partir des erreurs précédentes ; arrêt de la compilation
    1>
    1>ÉCHEC de la build.
    1>
    1>Temps écoulé 00:00:01.02
    ========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========
    


    Jean Noël Martin

    jeudi 16 juillet 2015 18:55
  • Réfléchissez un peu, SVP. !!!

    std::wstring sDocTypeM[enDocTypeM::NUMBER_OF_DOCTYPE] = {L"", L"Word Document",
    	  L"HTML Document", L"XML Document"};


    Paul Bacelar, Ex - MVP VC++

    vendredi 17 juillet 2015 01:14
    Modérateur
  • Ça arrange bien les problèmes, mais je croyais qu'en code manage le System:String^ était la règle

    quoi qu'il en soit c'est la solution : voici le code qui compile

    	std::wstring CDocType::EnumToStr( enDocTypeM Document)
    	{
    	 std::wstring sDocTypeM[enDocTypeM::NUMBER_OF_DOCTYPE] = {L"", L"Word Document", L"HTML Document", L"XML Document"};
    	  return( sDocTypeM[ Document]);
    	};
    
    	enDocTypeM CDocType::StrToEnum( System::String^ sDocument)
    	{
    		System:String^ wsDocM;
    		std::wstring sDocTypeM[ enDocTypeM::NUMBER_OF_DOCTYPE] = {L"", L"Word Document", L"HTML Document", L"XML Document"};
    		unsigned long iDoc = enDocTypeM::NUMBER_OF_DOCTYPE;
    		wsDocM = gcnew String( sDocTypeM [iDoc].c_str());
    		while (--iDoc > enDocTypeM::DOCTYPE_NONE && wsDocM != sDocument)
    		{
    			wsDocM = gcnew String( sDocTypeM [iDoc].c_str());
    		}
    		return ((enDocTypeM)iDoc);
    	};
    };


    Jean Noël Martin



    vendredi 17 juillet 2015 05:14
  • >je croyais qu'en code manage le System:String^ était la règle

    Sauf qu'un tableau à la C, c'est du C et une "list initialization" (http://en.cppreference.com/w/cpp/language/list_initialization) c'est du C++11, donc rien à voir avec du C++/CLI donc avec du code managé.


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse JeanNoel53 vendredi 17 juillet 2015 08:16
    vendredi 17 juillet 2015 07:48
    Modérateur