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 :

[Recherche] Un équivalant a iterator._Ptr sous Linux.


Sujet :

SL & STL C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 19
    Par défaut [Recherche] Un équivalant a iterator._Ptr sous Linux.
    Hello, je recherche un équivalant a iterator._Ptr sous Linux, ayant développé mon application sous Windows, j'ai juste une erreur de compilation sur sa, et j'ai besoins de cette fonction ( si l'iterator n'est pas bon, un (*iterator) déclenche une exception).

    Merci

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut, et bienvenue sur le forum...

    Normalement, les noms et symboles commençant par _ sont réservés au standard et à son implémentation...

    Idéalement, tu n'aurais donc pas du utiliser _Ptr dans ton code

    Ceci dit, pourquoi baser ta logique sur le lancement (espéré) d'une exception lors de l'appel d'un comportement propre aux itérateurs

    Ne serait-il pas plus simple, et sans doute bien plus efficace, de faire un test afin de t'assurer que l'itérateur est valide
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 19
    Par défaut
    Et comment je peut vérifier sa ? étant donné que mon for() verifie déja si l'iterator n'est pas égal a list.end().

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par Izidor's Voir le message
    Et comment je peut vérifier sa ? étant donné que mon for() verifie déja si l'iterator n'est pas égal a list.end().
    Si tu es dans une boucle, tes itérateurs devraient être valides...

    Si tu manipule un conteneur de pointeurs (std::vector<type *> par exemple ) ton problème vient non pas du fait que ton itérateur est invalide, mais du fait que le pointeur l'est devenu...

    Et ca, ca signifie que tu as un delete qui traine quelque part où il n'aurait pas du se trouver

    Je commencerais donc par chercher tous les delete et par vérifier, soit que le pointeur est supprimé du conteneur, soit que le pointeur est mis à NULL.

    Dans le second cas, il s'agira alors de vérifier, avant d'invoquer la moindre méthode au départ du pointeur, si (*it) n'est pas nul
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 19
    Par défaut
    Justement, la vérification if(!*itr) provoque une exception :s
    Et non, malheureusement je n'est aucun delete.

  6. #6
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Montre un bout de code minimale qui reproduise l'exception.. ça ira plus vite..

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 19
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		for(BoundInstancesMap::iterator itr_temp = m_boundInstances[save->GetDifficulty()].begin(); itr_temp != m_boundInstances[save->GetDifficulty()].end(); itr_temp++)
    		{
    			if((*itr_temp) && (*itr_temp)->mapId == save->GetMapId())
    			{
    				m_boundInstances[save->GetDifficulty()].erase(itr_temp);
    				break;
    			}
    		}

  8. #8
    zul
    zul est déconnecté
    Membre chevronné Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Par défaut
    Comme écrit dans la FAQ, et répéter un bon milliard de fois, après ton erase, l'itérateur n'est plus valide, d'où le comportement que tu vois.

    Voir http://cpp.developpez.com/faq/cpp/?p...ssion_elements pour la bonne façon de faire.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 19
    Par défaut
    Sauf que je fait un break et après il y a plus de boucle (...).

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut
    Salut

    Citation Envoyé par Izidor's Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		for(BoundInstancesMap::iterator itr_temp = m_boundInstances[save->GetDifficulty()].begin(); itr_temp != m_boundInstances[save->GetDifficulty()].end(); itr_temp++)
    		{
    			if((*itr_temp) && (*itr_temp)->mapId == save->GetMapId())
    			{
    				m_boundInstances[save->GetDifficulty()].erase(itr_temp);
    				break;
    			}
    		}

    Qu'est ce que BoundInstances ? si c'est une map, je n'utiliserai pas l'operateur [], qui crée un élément, mais plutôt find, qui verifie qu'un élément existe. Si c'est un vector, es tu sûr que tu ne depasses pas la taille du tableau ?
    Ton code (à mon goût) mériterai d'être scindé :

    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
    // Je suppose que m_boundInstances est un std::vector
    assert(save);
    assert(save->GetDifficulty() < m_boundInstances.size());
    BoundInstancesMap& boundInstanceMap = m_boundInstances.at(save->GetDifficulty());
    // si c'est une map, faire : save->GetDifficulty()
    // BoundInstancesMap::iterator itBoundInstanceMap = m_boundInstances.find(save->GetDifficulty());
    // if (itBoundInstanceMap == m_boundInstances.end()) {
    //    return; // ou throw
    // }
    for (BoundInstancesMap::iterator itr_temp = boudInstanceMap.begin(); itr_temp != boundInstanceMap.end(); ++itr_temp)
    {
    	if ((*itr_temp) && (*itr_temp)->mapId == save->GetMapId())
    	{
    		boundInstanceMap.erase(itr_temp);
    		break;
    	}
    }
    En esperant que cela te fasse avancer...
    --
    Jérémie

  11. #11
    zul
    zul est déconnecté
    Membre chevronné Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Par défaut
    Autant pour moi. Pourquoi ne pas utiliser find puis erase dans ce cadre, ça serait plus compréhensible ?

    Ton appli est-elle multithreadé ? Est-ce qu'il est possible qu'il y'ait des accès concurrents à boundInstances ou à save ?

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 19
    Par défaut
    Enfaite, ce n'est ni un vector, ni une map mais une list.
    L'opérateur [], c'est uniquement pour un tableaux ( c'est une list<Struct*> BoundInstancesMap[2] ).

    Je suis sur qu'il n'y a pas de dépassement de tableaux, sa oui.
    Sur une list, je ne peut pas faire find, après il me semble qu'il y a une fonction std::find() mais je ne sais pas m'en servir, et je ne sais pas si sa me serrais utile.

    Et non, l'application n'est pas multithread (encore heureux ).

  13. #13
    Membre très actif
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Par défaut
    Citation Envoyé par Izidor's Voir le message
    après il me semble qu'il y a une fonction std::find() mais je ne sais pas m'en servir, et je ne sais pas si sa me serrais utile.
    voir par exemple

    http://www.cplusplus.com/reference/algorithm/find/

  14. #14
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Si BoundInstancesMap est une list, le plus simple est d'utiliser list::remove_if
    http://www.cplusplus.com/reference/stl/list/remove_if/

    Si c'est une map il n'y a rien d'équivalent dans la STL (a ma connaissance), mais je doit avoir bien au chaud une petite fonction qui fait ca.

  15. #15
    zul
    zul est déconnecté
    Membre chevronné Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Par défaut
    Ça ne fait pas exactement la même chose, étant donné qu'il supprime uniquement la première entrée associé à son id. Evidemment, on pourrait ajouter un state dans le foncteur pour assurer le même comportement (ou très probablement il n'y a qu'un seul id de ce type dans la liste). Dans tous les cas, remove_if peut-être utilisé comme un algorithme générique travaillant sur des itérateurs (quelquesoit la structure sous-jacente)

    En même temps, si il a véritablement un problème d'itérateur, au vu du code, la seule explication logique que je vois dans ce bout de code c'est que getDifficulty renvoie un nombre non compris dans [0-1], ce qui ne changera pas grand chose au final. D'autres explications possibles sont une corruption de la structure ailleurs dans le code, mais on ne peut pas deviner à la seule vue de ce code.

Discussions similaires

  1. Recherche API pour lecture port USB sous Linux
    Par pcouas dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 20/10/2013, 16h03
  2. recherche de site sur la programmation sous linux
    Par philmor34 dans le forum Linux
    Réponses: 1
    Dernier message: 02/07/2008, 12h13
  3. [Lazarus] Recherche l'équivalent de getRvalue sous Linux
    Par pilou63 dans le forum Lazarus
    Réponses: 2
    Dernier message: 10/05/2008, 11h55
  4. Recherche outil d'administration de mysql sous LINUX
    Par PamelaGeek dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 10/04/2006, 16h45
  5. Rechercher le source du projet NetFilter sous Linux
    Par Hirouchima dans le forum Applications et environnements graphiques
    Réponses: 6
    Dernier message: 18/11/2005, 15h32

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