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

SL & STL C++ Discussion :

Reculer, stagner dans un parcourt de map par itérateurs


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 66
    Par défaut Reculer, stagner dans un parcourt de map par itérateurs
    Salut à tous,

    J'ai à nouveau une question concernant le C++.

    Je parcoure une map très pour interroger un a un tous les éléments de la map (qui sont des entités communicantes). Je fais ça avec un pointeur.

    Le problème c'est que le medium de communication est plutôt pourrave, et parfois une entité ne me répond pas. Par bonheur, j'ai un système d'ACK qui me permet de détecter ça. Lorsqu'une entité passe en NACK j'aimerai qu'elle retente un peu, histoire de voir si elle est décédée (R.I.P.) ou si c'est mon médium qui fait des siennes.

    Voilà le code que j'utilise (en simplifié), mais le --pos ne réalise pas l'effet escompté :

    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
     
     
    int essai_max = 5;
    int essai = 0;
     
    std::map<std::string,entite>::iterator pos;
     
    for (pos = entite_list.begin(); pos != entite_list.end(); ++pos)
    {
        if (entite.repond())
            /* traitement */
        else if (essai < essai_max)
        {
            --pos; //ici, naivement, je me dis que le meme va passer deux fois, vu que je recule ce que j'avance (pos + 1 - 1 = pos) 
            essai++;
        }       
    }
    Et en pratique, je n'observe pas ce que je veux obtenir.

    Quelqu'un peut-il m'expliquer le souci ?

    Merci beaucoup et bonne soirée à vous !

    Cyril

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    Si c'est pour stagner, il vaut mieux le faire explicitement.
    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
     
    for (pos = entite_list.begin(); pos != entite_list.end(); ++pos)
    {
    do
    {
        if (entite.repond())
        {
            /* traitement */
            break;
        }
        else     {
            essai++;
        } 
    }while(essai_max)      
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 66
    Par défaut
    Ok merci je pense que je vais revoir mon code dans ce sens.

    Mais pour ma compréhension personnelle, il y a une raison pour laquelle mon code ne fonctionnait pas ?

    Merci

    Cyril

  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,
    A priori l'itérateur d'un map est bi-directionnel. Cependant, s'il s'agit du premier élément, --it devient un itérateur invalide et c'est probablement là où ça coince. Car après rien ne te garantie que ++it te refais pointer vers le premier élément. Cela doit probablement provoquer un comportement indéterminé. Apparemment, Visual Express génère une exception et gcc semble mettre l'itérateur à end().

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Il y a surtout le fait qu'au moment où tu décrémentes ton pointeur la première fois, tu n'as PAS encore incrémenté "pos" via le 3ème argument de boucle... Donc, au premier retry, tu pars directement sur l'élément précédent.
    Donc, comme le dit 3DArchi, si tu es sur le premier, ça coince. Et si tu le fais dans l'autre sens, c'est sur le dernier que ça plantera (ta boucle for se terminera avant d'avoir fait le 2ème essai sur le dernier élément).

    Dans un principe de ce genre, il ne faut idéalement JAMAIS tenter de truander le pointeur, mais bel et bien empêcher la boucle de continuer tant que tu n'as pas atteint le nombre maximum d'essais.
    Le risque est déjà "grand" sur un simple itérateur de container, c'est encore pire si le pointeur en question est issu du résultat d'une commande bas niveau (sélection de carte matérielle et/ou de contexte OS) : c'est un coup à geler la machine sans préavis...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 66
    Par défaut
    Merci de vos réponses, le fait de "truander le pointeur" me semblait également bancal

    J'ai opté pour une boucle dans le for, qui résout totalement mon problème.

    Bonne journée,

    Cyril

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Apple remplace Google Maps par OpenStreetMap dans iPhoto
    Par Flaburgan dans le forum Actualités
    Réponses: 11
    Dernier message: 15/03/2012, 16h47
  2. Imprimer une dans un ".bat" sur Imp. par défaut (M
    Par argoet dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 19/11/2004, 09h53
  3. Réponses: 4
    Dernier message: 09/11/2004, 22h38
  4. Package Dans un schema maitre executé par un schema Esclave
    Par argoet dans le forum Administration
    Réponses: 18
    Dernier message: 29/09/2004, 16h34

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