none
un iterateur qui s'initialize mal RRS feed

  • Question

  • bonjour,

    J'ai un itérateur qui s'initialise sur le dernier élément de la liste:

              iSize = pProposition->ListChunk.size();
    	  itChunk = pProposition->ListChunk.begin();
    	  pChunk = *itChunk;
    

    iSize vaut 5: il y a bien 5 élément dans ListChunk;

    itChunk est positionné sur le premier élément de la liste par l'instruction begin();

    mais pChunk pointe sur le dernier élément.

    Comment faire pointer pChunk sur l'élément pointé par itChunk?


    Jean Noël Martin

    vendredi 13 décembre 2013 11:00

Réponses

  • J'ai modifié le code pour essayer d'avoir moins de défaut et ça  a réglé "provisoirement" le problème.

    je vous met le code ci-dessous et je précise à paul que:

    J'utilise begin et pas rbegin

       {
          i = 0;
    	  pProposition = *itProposition;
    	  iSize = pProposition->ListChunk.size();
    	  itChunk = pProposition->ListChunk.begin();
    	  while( itChunk != pProposition->ListChunk.end() && i < iSize)
          {
             if( i == 0)
    		 {
    			 pChunk = *itChunk;
    			 wsText = L"";
    			 itWord = pChunk->ListWord.begin();
    			 while( itWord != pChunk->ListWord.end())
    			 {
    				 pWord = *itWord;
    				 wsText = wcsxcat( false, 2, (wchar_t*)wsText.c_str(), (wchar_t*)pWord->wsWord.c_str());
    				 wsText += L" ";
    				 itWord++;
    			 }
    			//	[Create the Lemmas of the segment to create] =
    			//	DO
    			//		ErrorCode:=[call the method "CreateSegmentLemmas(Language,ListWord of pLinguisticSegment of pAnalysedSegment)"]
    			ErrorCode |= CreateSegmentLemmas(pAnalysedSegment->Language, pChunk->ListWord);
    			//	OD
    			//
    			//	[Create the Words of the segment to create] =
    			//	DO
    			//		ErrorCode:=[call the method "CreateSegmentWords(Language,hidNewSegmentID, ListWord of pLinguisticSegment of pAnalysedSegment)"]
    			ErrorCode |= CreateSegmentWords(pAnalysedSegment->Language, hidNewSegmentID, pChunk->ListWord);
    			itOldChunk = itChunk;
    			i++;
    		 }
    		 if( itChunk != itOldChunk)
    		 {
    			pChunk = *itChunk;
    			wsText = L"";
    			itWord = pChunk->ListWord.begin();
    			while( itWord != pChunk->ListWord.end())
    			{
    				 pWord = *itWord;
    				 wsText = wcsxcat( false, 2, (wchar_t*)wsText.c_str(), (wchar_t*)pWord->wsWord.c_str());
    				 wsText += L" ";
    				 itWord++;
    			}

    avec ce code sa se déroule dans l'ordre.

    Je passe le code en std::wstring pour la database au fur et à mesure du besoin, et pour cela j'ai besoin de passer du code a variables liste de variable

    Je l'ai expliqué dans un autre thread ci-dessous


    Jean Noël Martin




    • Marqué comme réponse JeanNoel53 vendredi 13 décembre 2013 18:33
    • Modifié JeanNoel53 vendredi 13 décembre 2013 18:34
    • Non marqué comme réponse JeanNoel53 vendredi 13 décembre 2013 18:34
    • Marqué comme réponse JeanNoel53 dimanche 15 décembre 2013 17:18
    vendredi 13 décembre 2013 18:29

Toutes les réponses

  • Avec les types concrets des variables ça serait plus simple.

    Un itérateur n'est pas obligé de suivre "précis" d'une liste non-ordonnée.


    Paul Bacelar, Ex - MVP VC++

    vendredi 13 décembre 2013 11:33
    Modérateur
  • Bon, donc il y a une explication!!

    et la solution? un type concret c'est quoi?


    Jean Noël Martin

    vendredi 13 décembre 2013 12:15
  • La solution : arrêter de faire des assertions sur comment devrait fonctionner un iterateur et lire ça documentation.

    Premier ou dernier, ça n'a pas de sens dans une liste non ordonnée.

    L'implémenteur de l'itérateur est en droit de le faire commencer par l'élément qui l'arrange le mieux.

    Le type concret est le type de l'objet concrètement en mémoire, son type dynamique si vous voulez.

    Si vous avez du mal avec ce concept, on se contentera de leurs types déclarés.


    Paul Bacelar, Ex - MVP VC++

    vendredi 13 décembre 2013 12:49
    Modérateur
  • Je vous met le code et mes essais ci-dessous:

    while( itProposition != pAnalysedSegment->pLinguisticSegment->ListProposition.end())
       {
          i = 0;
    	  pProposition = *itProposition;
    	  iSize = pProposition->ListChunk.size();
    	  itChunk = pProposition->ListChunk.begin();
    	  while( itChunk != pProposition->ListChunk.end() && i < iSize)
          {
             pChunk = *itChunk;
    		 //	[Create the Lemmas of the segment to create] =
             //	DO
             //		ErrorCode:=[call the method "CreateSegmentLemmas(Language,ListWord of pLinguisticSegment of pAnalysedSegment)"]
             ErrorCode |= CreateSegmentLemmas(pAnalysedSegment->Language, pChunk->ListWord);
             //	OD
             //
             //	[Create the Words of the segment to create] =
             //	DO
             //		ErrorCode:=[call the method "CreateSegmentWords(Language,hidNewSegmentID, ListWord of pLinguisticSegment of pAnalysedSegment)"]
             ErrorCode |= CreateSegmentWords(pAnalysedSegment->Language, hidNewSegmentID, pChunk->ListWord);
             itChunk++;
    		 i++;
    		 
          }
          //	[Create the Chunks of the segment to create] =
          //	DO
          //		ErrorCode:=[call the method "CreateSegmentChunks(Language,hidNewSegmentID, ListChunk of pLinguisticSegment of pAnalysedSegment)"]
          ErrorCode |= CreateSegmentChunks(pAnalysedSegment->Language,hidNewSegmentID,pProposition->ListChunk);
          //	OD
          //
          itProposition++;
       }

    J'ai essayé de mettre un reverse, ca n'a rien chagé l'iterateur reste bloqué sur le premier evenement. Moi je peux triater les évènement dans un sens ou dans l'autre, mais j'ai besoin de parcourir la liste. Y a t'il un moyen de sen sortir?. Ce serait un code managé je prendrai un for each; mais ici c'est du code std


    Jean Noël Martin

    vendredi 13 décembre 2013 13:37
  • déclaration de "itProposition", svp.

    déclaration de "pAnalysedSegment", svp.

    définition du type de "pAnalysedSegment" pour connaitre le type de "pLinguisticSegment", svp.

    ...

    idem pour "ListProposition", svp.

    ...

    On n'est pas de Oracles, et vous n'êtes pas un débutant, donc aidez-nous ne pas faire de vos questions des énigmes de cours de récré. :-((

    "Ce serait un code managé je prendrai un for each; mais ici c'est du code std"

    C'est encore plus simple en C++11 :

    http://www.cprogramming.com/c++11/c++11-ranged-for-loop.html


    Paul Bacelar, Ex - MVP VC++

    vendredi 13 décembre 2013 15:26
    Modérateur
  • je réponds point par point:

    std::list<CElementSemantique *>::iterator itProposition;
    CAnalysedSegment * pAnalysedSegment;
    	class CAnalysedSegment
    	{
    	public:
    		erc							ullSegmentID;             //  Identifiant du Segment dans la base de données
    		CLinguisticSegment *        pLinguisticSegment;       //  Segment decomposition
    		CLayout *                   pSegmentLayout;           //  Segment layout at the segment level only
    		short                       shSegmentCharLength;      //  Number of character in sentence
    		short                       shSegmentWordLength;      //  Number of words in sentence
    		enLanguage                  Language;                 //  Langue du segment
    		unsigned long               ulDocPosition;             //  Segment position into the Document
    
    		CAnalysedSegment::CAnalysedSegment();
    		CAnalysedSegment::~CAnalysedSegment();
    	};
    
    	class CLinguisticSegment
    	{
    	public:
    		std::list<CAnalysedWord *>  ListWord;                 //  Liste de pointeurs sur les Mots qui constituent le Segment
    		std::list<CVirtualEquation *> ListEquation;           //  Liste de pointeurs sur les Equations
    		std::list<CElementSemantique *> ListProposition;      //  Liste de pointeurs sur les Ngrams qui sont dans le Segment
    		std::list<CAnalysedChunk *> ListChunk;                //  Liste de pointeurs sur les Chunks qui sont dans le Segment
    		std::list<ElementSemantic *> ListPredicat;
    		std::list<ElementSemantic *> ListPrecondition;
    		std::list<ElementSemantic *> ListQualificatif;
    		std::list<ElementSemantic *> ListUnivers;
    		std::list<QualificateurNormalized*> listQualificateurNormalized;
    		std::list<PropositionNormalized*> ListPredicatNormalized;
    		std::list<PropositionNormalized*> ListPreconditionNormalized;
    		std::list<CObjet*> listObjectsNormalized;
    
    		CLinguisticSegment()
    		  {;}
    		~CLinguisticSegment()
    		  {;}
    	};

    Quant à la question std:: je vous demande si vous devez me faire acheter la version 11 de VS. je suis prêt à le faire mais j'ai besoin d'un conseil sur ce point.


    Jean Noël Martin

    vendredi 13 décembre 2013 16:59
  • C'est ma faute, je n'ai pas demandé le code d'initialisation de itProposition.
    Ma faute, ma très grande faute. ;-)
    Donc c'est avec un begin ou un rbegin que vous l'initialisé ?

    C++11 n'est pas VS2011, c'est le standard C++ sortie en 2011 après 8 ans de gestations.
    Tout compilateur "sérieux" se doit d'implémenter tout (mais plutôt partie) de ce standard.
    La gestation a été longue, donc VS a implémenté un très grand nombre des nouvelles fonctionnalités de C++11 avant sa sortie.
    Il est donc très probable que les versions 2008 et 2010 de VS implémentent déjà "syntaxical sugar" du "for(:<Enumérable>)". Sous réserve d'une modification de la configuration du compilateur pour prendre en compte cette compatibilité C++0x (ancien nom de C++11) et que la syntaxe n'ait pas trop bougée durant la standardisation.

    Même les pages de références sur iterator.begin() utilise cette fonctionnalité dans ces exemple.
    http://www.cplusplus.com/reference/list/list/begin/

    P.S.: Oh le beau bordel de pointeurs nus à la C, l'utilisation de pointeurs intelligents (smart pointeur : shared_ptr<>, unique_ptr<>... )vous éviterait bien des galères.


    Paul Bacelar, Ex - MVP VC++

    vendredi 13 décembre 2013 17:47
    Modérateur
  • J'ai modifié le code pour essayer d'avoir moins de défaut et ça  a réglé "provisoirement" le problème.

    je vous met le code ci-dessous et je précise à paul que:

    J'utilise begin et pas rbegin

       {
          i = 0;
    	  pProposition = *itProposition;
    	  iSize = pProposition->ListChunk.size();
    	  itChunk = pProposition->ListChunk.begin();
    	  while( itChunk != pProposition->ListChunk.end() && i < iSize)
          {
             if( i == 0)
    		 {
    			 pChunk = *itChunk;
    			 wsText = L"";
    			 itWord = pChunk->ListWord.begin();
    			 while( itWord != pChunk->ListWord.end())
    			 {
    				 pWord = *itWord;
    				 wsText = wcsxcat( false, 2, (wchar_t*)wsText.c_str(), (wchar_t*)pWord->wsWord.c_str());
    				 wsText += L" ";
    				 itWord++;
    			 }
    			//	[Create the Lemmas of the segment to create] =
    			//	DO
    			//		ErrorCode:=[call the method "CreateSegmentLemmas(Language,ListWord of pLinguisticSegment of pAnalysedSegment)"]
    			ErrorCode |= CreateSegmentLemmas(pAnalysedSegment->Language, pChunk->ListWord);
    			//	OD
    			//
    			//	[Create the Words of the segment to create] =
    			//	DO
    			//		ErrorCode:=[call the method "CreateSegmentWords(Language,hidNewSegmentID, ListWord of pLinguisticSegment of pAnalysedSegment)"]
    			ErrorCode |= CreateSegmentWords(pAnalysedSegment->Language, hidNewSegmentID, pChunk->ListWord);
    			itOldChunk = itChunk;
    			i++;
    		 }
    		 if( itChunk != itOldChunk)
    		 {
    			pChunk = *itChunk;
    			wsText = L"";
    			itWord = pChunk->ListWord.begin();
    			while( itWord != pChunk->ListWord.end())
    			{
    				 pWord = *itWord;
    				 wsText = wcsxcat( false, 2, (wchar_t*)wsText.c_str(), (wchar_t*)pWord->wsWord.c_str());
    				 wsText += L" ";
    				 itWord++;
    			}

    avec ce code sa se déroule dans l'ordre.

    Je passe le code en std::wstring pour la database au fur et à mesure du besoin, et pour cela j'ai besoin de passer du code a variables liste de variable

    Je l'ai expliqué dans un autre thread ci-dessous


    Jean Noël Martin




    • Marqué comme réponse JeanNoel53 vendredi 13 décembre 2013 18:33
    • Modifié JeanNoel53 vendredi 13 décembre 2013 18:34
    • Non marqué comme réponse JeanNoel53 vendredi 13 décembre 2013 18:34
    • Marqué comme réponse JeanNoel53 dimanche 15 décembre 2013 17:18
    vendredi 13 décembre 2013 18:29