none
des itérateurs incompatibles? RRS feed

  • Question

  • Bonjour,

    J'ai un portion de code qui est pervertie par une méthode

    Je vous donne d'abord les déclarations

    std::list<CAnalysedChunk *>::iterator itLocalChunk;
    std::list<CAnalysedWord *>::iterator  itWord;
    std::list<CAnalysedChunk *>::iterator itChunk;
    std::list<CAnalysedChunk *>::iterator itSavedChunk;

    puis le code. J'ai mis le itSavedChunk pour avoir la bonne valeur dans itChunk au sortir de la méthode AnalysePredicat.

    Ça se passe bien quand l'itChunk == itSavedChunk mais quand il est différent j'ai les messages ci dessous:

    					  itSavedChunk = itChunk;
                                              objProposition.AnalysePredicat( pCurrentElement, pPreviousElement, pLinguisticSegment, pChunk, Curpos, Step, bIsStopped, pbNewSegment, bIsInList, bNewSegmentOngoing, bIsPredicatAllocated, bMarkDeleted, bPivoted, bNounPending, processed, iPredicate, wsChunk, pWord, pPreviousChunk, pCurrentChunk, pNextChunk, pNext2Chunk);
    					  itChunk = itSavedChunk;
    

    les messages

    Une exception non gérée du type 'System.NullReferenceException' s'est produite dans SpecificationLoader.exe
    
    Informations supplémentaires : La référence d'objet n'est pas définie à une instance d'un objet.

    pourtant la valeur de litSavedChunk est cohérente (0x086E1500)

    comment sauvegarder un itérateur avec Visual Studio?


    Jean Noël Martin

    mercredi 31 octobre 2012 17:50

Réponses

Toutes les réponses

  • les iterateurs était  dans les variables globale et je les ai déplacé dans les variable locales

    comme ça n'avait rien changé, j'ai cherché une copie de l'intérateur.

    J'ai donc codé sur la base de la Librairie:

    copy( pLinguisticSegment->ListChunk.begin(), itChunk, itSavedChunk);

    et l’exécution m'a renvoyé une exception:

    Une exception de première chance de type 'System.Runtime.InteropServices.SEHException' s'est produite dans SpecificationLoader.exe

    en me disant que les itérateurs n'était pas référencées. (List iterator not dereferencables). Pour information avant l'exception le pointeur de itChunk pointe sur l'adressse OxO86F0410 ( je suppose que cette adresse est dans la pile) et le pointeur de itSavedChunk, dont c'est la première initialisation pointe sur 0.

    Je suis toujours à la recherche d'une solution sur pour mettre un itérateur à l'abri avant un traitement qui pourrait le manipuler malheureusement.



    Jean Noël Martin






    • Marqué comme réponse JeanNoel53 mercredi 31 octobre 2012 21:22
    • Non marqué comme réponse JeanNoel53 vendredi 2 novembre 2012 09:34
    • Modifié JeanNoel53 vendredi 2 novembre 2012 09:57
    mercredi 31 octobre 2012 21:21
  • VS ne fait qu'aider à la compilation, c'est un IDE, pas un environnement d'exécution.

    Il ne faut donc pas regarder du coté de VS mais des Runtimes et Framework utilisés par votre code.

    Pour correctement corrigé le problème, il faut en avoir une vue précise.

    Utilisez le débuggeur de VS. Configurez votre VS de tel sorte que le débuggeur reprennent la main lors de l'envoi non catché d'une exception de type : 'System.NullReferenceException' .

    Le débuggeur devrait vous donnez la ligne du code source où ce produit l'erreur.


    Paul Bacelar, Ex - MVP VC++

    vendredi 2 novembre 2012 16:19
    Modérateur
  • Je sais que le ligne ou se produit l'erreur est la  ligne citée dans mon document dans le deuxième post.

    cependant je suis intéressé pour savoir comment le VS doit être configuré pour que le debugger reprenne la main. J'ai le retry; mais derrière je reviens au démarrage debugging arrêté


    Jean Noël Martin



    • Modifié JeanNoel53 vendredi 2 novembre 2012 17:58
    vendredi 2 novembre 2012 17:32
  • Ce thread est toujours d'actualité

    Jean Noël Martin

    mercredi 7 novembre 2012 17:12
  • "mais derrière je reviens au démarrage debugging arrêté"

    C'est le programme qui est arrêté, pas le débuggeur.

    Vous devez pouvoir accéder aux valeurs des variables, la pile d'appel, la valeur des registres, les champs de l'exception ...

    Vous devez savoir vous servir du débuggeur de VS.


    Paul Bacelar, Ex - MVP VC++

    vendredi 9 novembre 2012 18:57
    Modérateur
  • La réponse sur ce sujet est donné dans l'autre post.

    mon besoin primaire est d'avoir une solution pour mettre la valeur d'un  itérateur à l'abri.


    Jean Noël Martin



    • Modifié JeanNoel53 vendredi 9 novembre 2012 19:08
    vendredi 9 novembre 2012 19:05
  • Le Design même des itérateurs rend leur stockage rend toute tentatvive de "stockage" vaine.

    Pourquoi voulez-vous "mettre la valeur d'un  itérateur à l'abri" ?


    Paul Bacelar, Ex - MVP VC++

    lundi 12 novembre 2012 09:30
    Modérateur
  • J'ai constaté, et j'ai trouvé logique que les itérateurs, passées en paramètre dans les méthodes appelées puisse être modifiés dans ces méthodes, et dans certains cas je voudrais garder la valeur de l'itérateur au départ pour faire des contrôles de cohérence en retour d'appel. Mais mes tentatives de copy restent vaines.

    Jean Noël Martin

    lundi 12 novembre 2012 09:36
  • Des contrôles de cohérences ???

    Il existe des const itérator qui interdisent la modification des objets itérés.

    Vous pouvez aussi utilisez des objets "tagués" const pour interdire leur modifications par les itérateurs.

    Et pourquoi ne pas "reconstruire" l'itérateur ?

    C'est juste un simple appel à .begin() pour en avoir un et à .end() pour avoir la condition de fin.

    Une approche préventive est bien plus efficace qu'un contrôle de cohérence. Par approche préventive, c'est donner des types qui interdisent les actions "illégitimes" sur les objets.


    Paul Bacelar, Ex - MVP VC++

    lundi 12 novembre 2012 11:40
    Modérateur
  • Je voudrais bien un explication sur ce que vous appelez une approche préventive.

    Jean Noël Martin

    lundi 10 décembre 2012 10:57
  • C'est déjà dans la dernière phrase de mon dernier post.

    Qu'est-ce que vous ne comprenez pas ?


    Paul Bacelar, Ex - MVP VC++

    mardi 11 décembre 2012 18:52
    Modérateur
  • Par approche préventive, c'est donner des types qui interdisent les actions "illégitimes" sur les objets.

    bon


    Jean Noël Martin

    • Marqué comme réponse JeanNoel53 mardi 11 décembre 2012 19:17
    mardi 11 décembre 2012 19:17