none
une question plus simple, comment déclarer un tableau en interface RRS feed

  • Question

  • Bonjour,

    Je dois dire au compilateur d'allouer de la place pour une variable; J'ai du mal a trouver la bonne syntaxe; Cette variable est nomée stAnalysedWord pListAnalyserWord[127]; J'ai codé:

    le header:

    /*******************************************************************************
     * NOM: 
     * ROLE: 
     * HISTORIQUE:
        * 05/05/2001, xxx, initial version
    *******************************************************************************/
    #ifndef PARSERMANAGER_H
    #define PARSERMANAGER_H
    /*_____INCLUDE-FILES__________________________________________________________*/
    /*_____GLOBAL-DEFINE__________________________________________________________*/
    
    #define LEMMA_TRANSLATION_NUMBER 100
    #define LEMMA_SIZE 256
    #define WORD_NUMBER_OF_A_BLOC 5000
    
    /*_____GLOBAL-TYPES___________________________________________________________*/
    /*_____GLOBAL-MACROS__________________________________________________________*/
    /*_____GLOBAL-FUNCTIONS-PROTOTYPES____________________________________________*/
    /*_____CLASS-DEFINITION_______________________________________________________*/
    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;
    
    	class CParserManager
    	{
    		private :
    			enum
    			{
    				PARSE_BLOC = 1,
    				GET_TRANSLATIONS_OF_SOURCE_LEMMA
    			};
    			enLanguage m_Language;
    			void *m_pXeldaManager;
    		public :
    			CParserManager::CParserManager();
    			CParserManager::~CParserManager();
    			erc CParserManager::Brill_ParseBloc(  wchar_t * pBlocText, stAnalysedWord pListAnalysedWord[127], unsigned long* ulWordNumber, long iPos);
    			erc CParserManager::ParserAnalyse( stAnalysedWord* pListAnalysedWord, std::list<CAnalysedWord *> *pListWord, unsigned long ulWordNumber);
    			erc CParserManager::InitParserManager(enLanguage Language);
    			erc CParserManager::GetTranslationsOfSourceLemma(std::wstring wsSourceLemma, enLanguage SourceLanguage,enLanguage TargetLanguage, std::list<CLemmaDescription *> &ListLemmaTranslation);
    			void CParserManager::QualifPivot( stAnalysedWord* pListAnalysedWord, int ulWordNumber);
    			int CParserManager::BTranscodePartOfSpeech( char* NextStr, char* str, char* wd, char* pPOS, char* pFlex, enStatus* iStatus);
    			erc CParserManager::ParseBloc( std::wstring wsBloc, std::list<CAnalysedWord *>* pListWord);
    			char* CParserManager::strtolower( char *str);
    	};
    	extern SpecificationLoader::CParserManager objParserManager;
    };
    
    
    #endif /* PARSERMANAGER_H */

    il y a aussi le code de appelant:

    erc CParserManager::ParseBloc(std::wstring wsBloc, std::list<CAnalysedWord *>* pListWord)
    {
      enum ParseBlocErrors{
        PARSE_ERROR = 1,
        ERROR_AT_PARSER_OPENING
      };
    
      erc ErrorCode = INIT_NO_ERROR;
      unsigned long ulWordNumber = 0;
      ErrorCode = INIT_NO_ERROR;
      long iPos = 0;
        
        do
    	{
     912       ErrorCode = Brill_ParseBloc((wchar_t *)wsBloc.c_str(), pListAnalysedWord[127], &ulWordNumber, (long)iPos);
        }
        while( ErrorCode != INIT_NO_ERROR);
        if (ErrorCode == INIT_NO_ERROR)
        {
           // Analyse of Parsing result
           ErrorCode = ParserAnalyse(  pListAnalysedWord,  pListWord,  ulWordNumber);
        }
        else
        {
           // Error during Xelda Parsing
           ErrorCode = objStrConv.CreateReturnCode(TYPE_ERROR,MSG_PARSE_ERROR,MODULE_ID_PARSER_MANAGER,
                      PARSER_CPARSERMANAGER ,PARSE_BLOC,
                      PARSE_ERROR);
        }
    // Error during Xelda opening
    //  {
    //    objStrConv.CreateReturnCode(TYPE_ERROR,MSG_ERROR_AT_PARSER_OPENING,MODULE_ID_PARSER_MANAGER,
    //            PARSER_CPARSERMANAGER,PARSE_BLOC,
    //            ERROR_AT_PARSER_OPENING, & ErrorCode);
    //  }
    //  CXeldaManager_Close(m_pXeldaManager);
        return (ErrorCode);
    }
    

    C'est la ligne 912 qui est en erreur.

    et le prototype de l'appelé:

    erc CParserManager::Brill_ParseBloc(  wchar_t * pBlocText, stAnalysedWord pListAnalysedWord[127], unsigned long* ulWordNumber, long iPos)
    {

    enfin l'erreur diagnostiqué

    1>..\..\..\..\Linguistic\ParserManager\src\ParserManager.cpp(912): error C2664: 'SpecificationLoader::CParserManager::Brill_ParseBloc' : impossible de convertir le paramètre 2 de 'stAnalysedWord' en 'stAnalysedWord []'
    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>


    Jean Noël Martin

    mercredi 4 décembre 2013 18:34

Réponses

  • Bonjour,

    Lorsque vous appelez votre méthode :

    ErrorCode = Brill_ParseBloc((wchar_t *)wsBloc.c_str(), pListAnalysedWord[127], ...)

    Vous passez dans le 2ème argument le 128ème élément du tableau pListAnalysedWord. Alors que votre méthode attend en paramètre un tableau...

    Vous devez donc corriger l'appel à votre méthode comme ceci :

    ErrorCode = Brill_ParseBloc((wchar_t *)wsBloc.c_str(), pListAnalysedWord, ...

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    jeudi 5 décembre 2013 00:19
    Modérateur
  • Je vais utiliser les liste d'arguments variables plus loin. Pour l'instant je retravaille la liste d'arguments. J'ai supprimé le code ci dessous pour écrire directement dans la liste de sortie.

    Jean Noël Martin

    • Marqué comme réponse JeanNoel53 lundi 9 décembre 2013 08:36
    lundi 9 décembre 2013 08:36

Toutes les réponses

  • Bonjour,

    Lorsque vous appelez votre méthode :

    ErrorCode = Brill_ParseBloc((wchar_t *)wsBloc.c_str(), pListAnalysedWord[127], ...)

    Vous passez dans le 2ème argument le 128ème élément du tableau pListAnalysedWord. Alors que votre méthode attend en paramètre un tableau...

    Vous devez donc corriger l'appel à votre méthode comme ceci :

    ErrorCode = Brill_ParseBloc((wchar_t *)wsBloc.c_str(), pListAnalysedWord, ...

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    jeudi 5 décembre 2013 00:19
    Modérateur
  • J'ai corrigé l'appel en codant dans le prototype;

    erc CParserManager::Brill_ParseBloc(  wchar_t * pBlocText, stAnalysedWord pListAnalysedWord[WORD_NUMBER_OF_A_BLOC], unsigned long* ulWordNumber, long iPos)

    en modifiant l'indexation des mots:

    wcscpy_s( (wchar_t*)pListAnalysedWord[ulTotalWordNumber].wsWord.c_str(), len + 1, s);

    et en traitant l'appel par un pointeur;

    ErrorCode = Brill_ParseBloc((wchar_t *)wsBloc.c_str(), pListAnalysedWord, &ulWordNumber, (long)iPos);


    Jean Noël Martin

    jeudi 5 décembre 2013 01:54
  • pourquoi démarquer comme réponse quelque chose qui fonctionne???

    Jean Noël Martin

    jeudi 5 décembre 2013 17:31
  • Parce que le post de Gilles Tourreau répond à votre question.

    Pace que votre post indique comment vous avez contourné le problème mais sans expliquer pourquoi la réponse de Gilles ne vous convenait pas ni d'information supplémentaire pour invalider la réponse de Gilles.


    Paul Bacelar, Ex - MVP VC++

    vendredi 6 décembre 2013 11:49
    Modérateur
  • Je vais utiliser les liste d'arguments variables plus loin. Pour l'instant je retravaille la liste d'arguments. J'ai supprimé le code ci dessous pour écrire directement dans la liste de sortie.

    Jean Noël Martin

    • Marqué comme réponse JeanNoel53 lundi 9 décembre 2013 08:36
    lundi 9 décembre 2013 08:36