IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Problème sur des itérateurs


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 17
    Par défaut Problème sur des itérateurs
    Bonjour à tous,

    Je ne suis pas spécialement entraîné en C++ et je galère sur les itérateurs. Ca fait un petit moment que j'ai localisé une erreur que je ne comprends pas. Si vous pouviez m'aider à la résoudre...

    Il s'agit d'un bout de programme qui tente de lire deux listes imbriquées. Je m'explique :
    Dans la classe keyframespace il y a une liste statique de keyframespace. Chaque keyframespace a une map associant des String à des Quaternion.

    Je souhaite accéder aux quaternions de manière efficace, cad parcourir le moins de fois possible la liste.

    Du coup, j'esssaie de parcourir la liste de keyframespace, en effectuant un calcul sur chaque Quaternion de la map du-dit Keyframespace.

    Ce qui donne un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    list<Keyframespace>::const_iterator iter  = (Keyframespace::getKeyFrameSpace()).begin();
            printf("Boucle principale entrée %f, %f, %f, %f \n", iter->getThetaX(), iter->getThetaY(), iter->getDx(), iter->getDy()) ;
     
        while (iter != Keyframespace::getKeyFrameSpace().end())
        {
        printf("Boucle principale entrée %f, %f, %f, %f \n", iter->getThetaX(), iter->getThetaY(), iter->getDx(), iter->getDy()) ;
     
        for( Keyframedesign::Keyframedesign_::const_iterator iterDesign = (*iter).getK()->Keyframe_.begin() ; iterDesign !=iter->getK()->Keyframe_.end();) { 
            printf("Ici AVANT : %f, %f, %f, %f \n", iter->getThetaX(), iter->getThetaY(), iter->getDx(), iter->getDy()) ;
     
        printf(iterDesign->first) ;
           /* Calculs n'affectant pas la boucle */
     
            ++iterDesign ;
     
            }
     
        printf("Ici APRES: %f, %f, %f, %f \n", iter->getThetaX(), iter->getThetaY(), iter->getDx(), iter->getDy()) ;
     
        ++iter ;
     
        printf("Sortie de boucle interne\n") ;
     
        }
     printf("Sortie de boucle principale\n");

    J'ai le résulat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Boucle principale entrée 0.000000, 0.000000, 0.000000, 0.000000 
    Boucle principale entrée 0.000000, 1.000000, 0.000000, 0.000000 
    Ici AVANT : 0.000000, 1.000000, 0.000000, 0.000000 
    BD
    Ici AVANT : 0.000000, 1.000000, 0.000000, 0.000000 
    BG
    Ici AVANT : 0.000000, 1.000000, 0.000000, 0.000000 
    JD
    Ici AVANT : 0.000000, 1.000000, 0.000000, 0.000000 
    JG
    Ici APRES: 0.000000, 1.000000, 0.000000, 0.000000 
    Sortie de boucle interne
    Boucle principale entrée 0.000000, 0.000000, 0.000000, 0.000000 
    Erreur de segmentation
    En particulier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Boucle principale entrée 0.000000, 0.000000, 0.000000, 0.000000 
    Boucle principale entrée 0.000000, 1.000000, 0.000000, 0.000000
    Que je ne comprends pas.

    Merci pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    En reprenant ton code et nommant les différents printf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    list<Keyframespace>::const_iterator iter  = (Keyframespace::getKeyFrameSpace()).begin();
            printf("Boucle principale entrée %f, %f, %f, %f \n", iter->getThetaX(), iter->getThetaY(), iter->getDx(), iter->getDy()) ;   // (1)
     
        while (iter != Keyframespace::getKeyFrameSpace().end())
        {
        printf("Boucle principale entrée %f, %f, %f, %f \n", iter->getThetaX(), iter->getThetaY(), iter->getDx(), iter->getDy()) ;  // (2)
     
        for( Keyframedesign::Keyframedesign_::const_iterator iterDesign = (*iter).getK()->Keyframe_.begin() ; iterDesign !=iter->getK()->Keyframe_.end();) { 
            printf("Ici AVANT : %f, %f, %f, %f \n", iter->getThetaX(), iter->getThetaY(),  iter->getDx(), iter->getDy()) ; // (3)
     
        printf(iterDesign->first) ;  // (4)
           /* Calculs n'affectant pas la boucle */
     
            ++iterDesign ;
     
            }
     
        printf("Ici APRES: %f, %f, %f, %f \n", iter->getThetaX(), iter->getThetaY(), iter->getDx(), iter->getDy()) ; // (5)
     
        ++iter ;
     
        printf("Sortie de boucle interne\n") ;  // (6)
     
        }
     printf("Sortie de boucle principale\n"); // (7)
    et qui correspond effectivement à ta sortie :
    (1) Boucle principale entrée 0.000000, 0.000000, 0.000000, 0.000000
    (2) Boucle principale entrée 0.000000, 1.000000, 0.000000, 0.000000
    (3) Ici AVANT : 0.000000, 1.000000, 0.000000, 0.000000
    (4) BD
    (3) Ici AVANT : 0.000000, 1.000000, 0.000000, 0.000000
    (4) BG
    (3) Ici AVANT : 0.000000, 1.000000, 0.000000, 0.000000
    (4) JD
    (3) Ici AVANT : 0.000000, 1.000000, 0.000000, 0.000000
    (4) JG
    (5) Ici APRES: 0.000000, 1.000000, 0.000000, 0.000000
    (6) Sortie de boucle interne
    (2) Boucle principale entrée 0.000000, 0.000000, 0.000000, 0.000000
    Donc ton erreur de segmentation se situe entre (2) (non compris) et (3) (compris) ce qui réduit le champs de recherche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     for( Keyframedesign::Keyframedesign_::const_iterator iterDesign = (*iter).getK()->Keyframe_.begin() ; iterDesign !=iter->getK()->Keyframe_.end();) { 
            printf("Ici AVANT : %f, %f, %f, %f \n", iter->getThetaX(), iter->getThetaY(),  iter->getDx(), iter->getDy()) ; // (3)
    Vu qu'une erreur de segmentation va de paire avec pointeur (ou référence), il faut en chercher un... Et vu que tes itérateurs me paraissent valides, j'aurais tendance à incriminer le pointeur retourné par iter->getK()

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 17
    Par défaut
    Oui c'est sans doute ce getK() qui pose problème. Cela dit, mon problème là c'est que la valeur du printf(1) et celle affichée par printf(2) sont différentes :/

    D'autre part, si j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        printf("Avant incrementation : %f, %f, %f, %f \n", iter->getThetaX(), iter->getThetaY(), iter->getDx(), iter->getDy()) ;
        ++iter ;
        printf("Après incrémentation : %f, %f, %f, %f \n", iter->getThetaX(), iter->getThetaY(), iter->getDx(), iter->getDy()) ;
    A la place de seulement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        printf("Ici APRES: %f, %f, %f, %f \n", iter->getThetaX(), iter->getThetaY(), iter->getDx(), iter->getDy()) ;
        ++iter ;
    J'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Avant incrémentation: 0.000000, 1.000000, 0.000000, 0.000000 
    Après incrémentation: 0.000000, 0.000000, 1.000000, 0.000000 
    Sortie de boucle interne
    Boucle principale entrée 0.000000, 0.000000, 0.000000, 0.000000
    Comment les valeurs pourraient-elles être différentes entre la fin de boucle et le début? Sans modification entre temps? =/ (i.e (4) et (2) devraient avoir mêmes valeurs)

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Citation Envoyé par Lyth_o Voir le message
    Comment les valeurs pourraient-elles être différentes entre la fin de boucle et le début?
    A vu de nez sans avoir regardé de trop près ton code, je dirais que vu le nombre d'indirections que tu as (liées à tous ces accesseurs), tu as une copie cachée quelque part qui fait que tu ne manipules pas toujours le même objet.
    En résumé : un peu de respect pour cette brave Déméter

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 17
    Par défaut
    Mmh, d'accord. Peut être bien. Je vois pas vraiment d'autre explication qu'un phénomène étrange pour le coup...

    Est-ce qu'il suffirait de faire des variables intermédiaires pour stocker les accès intermédiaires? Ou carrément restructurer le code =( ?

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Lyth_o Voir le message
    Ou carrément restructurer le code =( ?
    Ca clarifiera certainement ton design.

Discussions similaires

  1. Problème sur des chaines de caractères
    Par soso78 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 16/10/2007, 13h11
  2. Réponses: 1
    Dernier message: 02/07/2007, 15h57
  3. PHP et IIS Problème sur des repertoires virtuels
    Par remi_neo dans le forum IIS
    Réponses: 1
    Dernier message: 30/05/2007, 17h17
  4. [MySQL] Problème sur des comptes (login/mdp)
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 13/03/2006, 15h41
  5. Problème sur des chaînes de caractères
    Par Anonymous dans le forum Access
    Réponses: 9
    Dernier message: 16/09/2005, 08h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo