none
un point d'entré inateignable RRS feed

  • Question

  • Bonjour

    J'ai une méthode qui est le point d'entré de l'analyse du code. cette méthode nommée AnalyseBlocText est appelée par WordManager. Ce code marchait très bien en V2. Il ne marche plus du tout en V3. je m'arrache les cheveux sur ce sujet et je n'ai pas d'autre solution que de regarder la V2 marcher et la V3 ne pas marcher.

    Par ailleurs j'ai vérifié que il n'y avait plus de #pragma unmanaged dans le code.

    Comme j'arrivais dans la phase précédente dans le ParserManager, J'ai modifié celui ci pour savoir si cet appel était hasardeux ou si il résultait du passage par la méthode AnalyseBlocText. les élément récoltés montrait que je n'était pas passé par la méthode, et quand je sortait en pas à pas je ressortais dans WordManager. J'ai alors déplacé la méthode de schedulerGlobal à ParserManager. Du cout plus rien ne s'exécute.

    Comme je suis complètement dans le cirage sur ce sujet je ne sais quoi mettre pour vous guider. Dans l'immédiat je vais donner l'appel de la méthode dans WordManager et la déclaration du prototype dans ParserManager:

    WordManager:

    		void CWManager::StartDocAnalysis( System::ComponentModel::BackgroundWorker^  backgroundWorker1, long ulNbWord, bool bNewDoc)
    		{				
    			std::list<CAnalysedSegment*>* pListSegment;
    			erc ulNbTWord;
    			
    			erc ProgressPercentage;
    			size_t iSize;
    			int iStatus = 0;
    			int i = 0; 
    			int j = 0;
    			bool bStatus;
    			Word::Words^ objWords;
    			Word::Range^ objWord;
                int iTitle = 0;
    			bool bTitle;
    			try
    			{
    				i = 0;
    				nParagraph = 0;
    				ulTotalNbWords = 0;
    				ulNbTWord = 0;
    				objParagraphs = objDocument->Paragraphs;
    //				String^ sDiskOfTheFile = marshal_as<String^>( wsDiskOfTheFile);
    //				String^ ssLogFile = sDiskOfTheFile + marshal_as<String^>( sLogFile);
    //				String^ ssSavedLogFile = sDiskOfTheFile + marshal_as<String^>( sSavedLogFile);
    				std::string sDiskOfTheFile = objStrConv.awcstombs((wchar_t*)wsDiskOfTheFile.c_str());
    				std::string ssLogFile = sDiskOfTheFile + sLogFile;
    				std::string ssSavedLogFile = sDiskOfTheFile + sSavedLogFile;
    				LPCTSTR lsLogFile = (LPCTSTR)ssLogFile.c_str();
    				LPCTSTR lsLogFileSaved = (LPCTSTR)ssSavedLogFile.c_str();
    				bStatus = CopyFile( lsLogFile, lsLogFileSaved, false);
    				LPTSTR lpszFunction = 0;
    				LPVOID lpMsgBuf;
    				LPVOID lpDisplayBuf;	
    				DWORD dw = GetLastError();
    				FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );
    				// Display the error message and exit the process
    				lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR)); 
    				StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) / sizeof(TCHAR), TEXT("%s failed with error %d: %s"), lpszFunction, dw, lpMsgBuf);
    				iStatus = remove( ssLogFile.c_str());
    				for each( Word::Paragraph^ objParagraph in objParagraphs)
    				{
    					pBloc = new CBloc;
    					pLayout = new CLayout;
    					pBloc->pLayoutBloc = pLayout;
    					iTitle = 0;
    					System::String^ wsText = objParagraph->default->default;
    					// Récupérer les informations de Layout
    					// Word::Paragraph::Format::ParagraphFormat^ Format = objParagraph->Format->ParagraphFormat;
    					Object^ Style = objParagraph->Style;
    					//if( Style->WdBuiltinStyle == L"T")
    					//   objFormat = Format.get();
    					const wchar_t* chars = (const wchar_t*)(Marshal::StringToHGlobalUni( wsText)).ToPointer();
    					char* c = objStrConv.awcstombs( (wchar_t*)chars);
    					Marshal::FreeHGlobal(IntPtr((void*)chars));
    					wchar_t* cha = objStrConv.ambstowcs( c);
    					objStrConv.StrFreeA( c);
    					pBloc->wsBlocText.append( cha);
    					objWords = objDocument->Words;
    					iSize = ulTotalNbWords;
    					iSize += i + 1;
    					if( iSize < 4)
    						iSize = 3 + i;
    					for( j = iSize- 2 + i; j < iSize + 1; j++)
    					{
    						objWord = (Word::Range^)objWords[j];
    						if( objWord->Case == Word::WdCharacterCase::wdTitleSentence || objWord->Case == Word::WdCharacterCase::wdTitleWord)
    							iTitle += 10;
    						else
    							iTitle -= 2;
    						if(objWord->Font->Size < 13)
    							iTitle -= 5;
    						else
    							iTitle += 2;
    					}
    					if( iTitle > 0)
    						bTitle = true;
    					else
    						bTitle = false;
    					pBloc->pLayoutBloc->bTitle = bTitle;
    					ulNbTWord = ulTotalNbWords;
    					// appeler SchedulerGlobal pour traiter le paragraph.
    					iSize = pBloc->wsBlocText.size();
    					if( iSize > 2)
    					{
    la ligne qui ne s'éxécute pas			ulTotalNbWords = CParserManager::AnalyseBlocText( pBloc, pListSegment, ulNbTWord, bNewDoc);
    					}
    					else if( iSize > 0 && ProgressPercentage < 80)
    					{
    						// erreur une partie du texte n'a pas été traitée
    						string sProposition = objStrConv.awcstombs((wchar_t*)pBloc->wsBlocText.c_str());
    				        string msg = "error: This text includes probably a control characther non appropriated : " + sProposition;
    					    objStrConv.StrFreeA( (char*)sProposition.c_str());
    						throw Doc_exception ( msg.c_str(), nParagraph);
    					}
    					// il faut appeler le backgroundWorker1_ProgressChanged( System::Object^ sender, ProgressChangedEventArgs^ e)
    					ProgressPercentage = 100 * ulTotalNbWords / ulNbWord;
    					backgroundWorker1->ReportProgress( ProgressPercentage);
    					objStrConv.StrFreeW( cha);
    					if( i < 2)
    					{
    						i++;
    					}
    				}
    				ProgressPercentage = 100;
    				backgroundWorker1->ReportProgress( ProgressPercentage);
    				objVirtualEquations.CheckVirtualEquations( pListSegment);
    				CloseDocument( backgroundWorker1, objApplication, objDocument, objDocuments);
    				objSchedulerGlobal.ClearListGrammaire( pListSegment);
    				//backgroundWorker2->ReportProgress( ProgressPercentage);
    			}
    			catch(...)
    			{
    			}
    		}

    et la déclaration:

    /*******************************************************************************
     * 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();
    			wchar_t* CParserManager::wcscpys( wchar_t* Out, int len, wchar_t* in);
    			erc CParserManager::ParseBloc( CBloc* pBloc, std::list<CAnalysedWord*>* pListWord);
    			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::Brill_ParseBloc( std::wstring wsBlocText, stAnalysedWord* pListAnalysedWord, unsigned long* ulWordNumber, long iPos);
    			static erc CParserManager::AnalyseBlocText( CBloc* pBloc, std::list<CAnalysedSegment*>* pListSegment, erc ulTotalNbWords, bool bIsnewDoc);
    			char* CParserManager::strtolower( char *str);
    	};
    };
    extern SpecificationLoader::CParserManager objParserManager;
    #endif /* PARSERMANAGER_H */

    Je répondrai aux questions au fur et à mesure que vous me répondrez.


    Jean Noël Martin


    • Modifié JeanNoel53 dimanche 1 décembre 2013 23:36
    dimanche 1 décembre 2013 23:33

Réponses

  • Bon,j'avais fait ce post en désespoir de cause: je vois qu'il a été mal accueilli. Je suis depuis reparti d'une version plus ancienne et je n'ai pas les mêmes problèmes. Donc je clos ce thread

    Jean Noël Martin

    • Marqué comme réponse JeanNoel53 mercredi 4 décembre 2013 18:22
    mercredi 4 décembre 2013 18:22

Toutes les réponses

  • Ce point est bloquant dans l'état du projet

    je suis revenu à l'etat de AnalyseBlocText dans SchedulerGlobal. Je n'ai plus aucune mention de unmanaged dans mon projet et ça ne  marche toujours pas. c'est pourtant depuis que j'ai mis les pragma unmanaged que ça ne s'exécute plus.

    Puis j'ai essayé de la déclarer en dehors de la classe

    elle est déclarée dans WordManager comme:

    extern erc AnalyseBlocText( SpecificationLoader::CBloc* pBloc, std::list< SpecificationLoader::CAnalysedSegment*>* pListSegment, erc ulTotalNbWords, bool bIsNewDoc);

    et existe dans sa classe d'origine sous la signature:

    erc AnalyseBlocText( SpecificationLoader::CBloc* pBloc, std::list< SpecificationLoader::CAnalysedSegment*>* pListSegment, erc ulTotalNbWords, bool bIsNewDoc)

    cette signature sort au link comme suit

    1>WordManager.obj : error LNK2028: jeton non résolu (0A000123) "unsigned __int64 __cdecl AnalyseBlocText(class SpecificationLoader::CBloc *,class std::list<class SpecificationLoader::CAnalysedSegment *,class std::allocator<class SpecificationLoader::CAnalysedSegment *> > *,unsigned __int64,bool)" (?AnalyseBlocText@@$$FYA_KPAVCBloc@SpecificationLoader@@PAV?$list@PAVCAnalysedSegment@SpecificationLoader@@V?$allocator@PAVCAnalysedSegment@SpecificationLoader@@@std@@@std@@_K_N@Z) référencé dans la fonction "public: static void __clrcall SpecificationLoader::CWManager::StartDocAnalysis(class System::ComponentModel::BackgroundWorker ^,long,bool)" (?StartDocAnalysis@CWManager@SpecificationLoader@@$$FSMXP$AAVBackgroundWorker@ComponentModel@System@@J_N@Z)
    1>WordManager.obj : error LNK2019: symbole externe non résolu "unsigned __int64 __cdecl AnalyseBlocText(class SpecificationLoader::CBloc *,class std::list<class SpecificationLoader::CAnalysedSegment *,class std::allocator<class SpecificationLoader::CAnalysedSegment *> > *,unsigned __int64,bool)" (?AnalyseBlocText@@$$FYA_KPAVCBloc@SpecificationLoader@@PAV?$list@PAVCAnalysedSegment@SpecificationLoader@@V?$allocator@PAVCAnalysedSegment@SpecificationLoader@@@std@@@std@@_K_N@Z) référencé dans la fonction "public: static void __clrcall SpecificationLoader::CWManager::StartDocAnalysis(class System::ComponentModel::BackgroundWorker ^,long,bool)" (?StartDocAnalysis@CWManager@SpecificationLoader@@$$FSMXP$AAVBackgroundWorker@ComponentModel@System@@J_N@Z)
    1>E:\usr\Memoria\dev\ALN_Kernel\make\SpecificationLoader\Release\SpecificationLoader.exe : fatal error LNK1120: 2 externes non résolus

    J'ai déplacé la Méthode hors du champ SpecificationLoader pour la faire matcher . mais ça n'a rien changé.

    Je repars donc de la V2 et j'avance progressivement.


    Jean Noël Martin





    • Modifié JeanNoel53 lundi 2 décembre 2013 16:01
    dimanche 1 décembre 2013 23:55
  • Je vois que vous ne respectez toujours pas la charte de ces forums malgré des mois de demande. :-(

    On ne peut pas répondre si la question ne tient pas toute seule, faite des références aux autres discussions si nécessaire (mais avec modération, une synthèse est préférable).

    Pas de "up" intempestif.

    "Ce code marchait très bien en V2. Il ne marche plus du tout en V3" ? c'est quoi ce V2 et ce V3

    Utilisez le débuggeur pour voir pourquoi vous ne passez pas là où vous vous attendiez.

    Il y a toujours une raison "logique", si c'est pas logique, indiquez précisément où c'est plus logique dans le pas à pas du débuggeur.


    Paul Bacelar, Ex - MVP VC++

    lundi 2 décembre 2013 23:30
    Modérateur
  • Ça n'aide pas beaucoup...

    Je suis reparti de la V2; Ça marche et je vérifie régulièrement que tout fonctionne, quand j'aurais trouvé je vous le dirais.


    Jean Noël Martin

    mardi 3 décembre 2013 08:59
  • Les forums, ce n'est pas que pour vous, mais pour toutes les personnes qui cherchent sur le net des réponses.

    Vos questions ne sont pas utiles à tous le monde, et vous ne les exposez pas assez bien pour que des personnes BENEVOLES puissent vous aider.


    Paul Bacelar, Ex - MVP VC++

    mardi 3 décembre 2013 09:38
    Modérateur
  • ???????,

    Jean Noël Martin

    mardi 3 décembre 2013 15:15
  • Je suis reparti de la V2 et J'avance normalement.

    J'ai repris la V2, je l'ai testé;

    Dans un premier temps j'ai sortie toutes les références à pragma unmanaged; Je l'ai testé.

    puis j'ai introduit les éléments de la V3 dans la V2

    Pour l'instant je suis dans le débug de la V3.

    je n'ai pas le même problème. Je ne sais toujours pas  quel était la raison du problème. Je laisse ce point aux experts...


    Jean Noël Martin

    mardi 3 décembre 2013 16:47
  • Les experts n'ont pas assez d'info car vous faites références à des informations inconnus de TOUS.

    Ici, c'est un forum, pas la HotLine/Support de M$.


    Paul Bacelar, Ex - MVP VC++

    mardi 3 décembre 2013 17:31
    Modérateur
  • Je pose les questions quand je suis sur un point dur.

    J'y met les informations que je peux trouver;

    mais je ne suis pas un expert et des fois j'expose les faits et je renseigne les évolutions. que puis je faire d'autre?


    Jean Noël Martin


    • Modifié JeanNoel53 mardi 3 décembre 2013 18:37
    mardi 3 décembre 2013 18:37
  • Bonjour,

    que puis je faire d'autre?
    Partir du principe que les personnes qui vont lire vos questions ne connaissent rien à votre projet, n'ont pas les sources sous les yeux, ne connaissencent pas l'environnement sur lequel vous travailler, le contexte de votre projet,.... Et partir du principe que des bénévoles comme moi répondons à une trentaine de questions par jour ce qui implique qu'il est impossible et voir difficile de croiser votre questions avec les précédentes !

    Lorsque vous nous parlez de V1, V2... On ne sait pas de quoi vous parlez et cela ne sert à personne d'autres à part vous... (Et donc pollue inutilement les forums et fait perdre du temps aux personnes qui essayent de répondre sur les forums...).

    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

    mercredi 4 décembre 2013 01:02
    Modérateur
  • Bon,j'avais fait ce post en désespoir de cause: je vois qu'il a été mal accueilli. Je suis depuis reparti d'une version plus ancienne et je n'ai pas les mêmes problèmes. Donc je clos ce thread

    Jean Noël Martin

    • Marqué comme réponse JeanNoel53 mercredi 4 décembre 2013 18:22
    mercredi 4 décembre 2013 18:22