2009-09-03 11 views
2

Je frappe un mur pendant le débogage de ma classe C++. Il est un graphique de toutes sortes, quelque chose comme ceci:Affichage "superficiel" des conteneurs STL en mode de débogage Visual Studio?

class Graph { 
    class Node { 
     std::map<int, Node>::iterator _neighbors[4]; 
    }; 
    std::map<int, Node> _map; 
}; 

Fondamentalement, chaque noeud conserve la trace des voisins exactement 4 en stockant itérateurs à eux dans la classe contenant carte.

Le problème est que quand je vais afficher le contenu de _MAP dans VS2008 pendant le débogage, je reçois quelque chose comme ceci:

- _map 
    - [0] 
     first 
    - second 
     - _neighbors 
     - _ptr 
      first 
      - second 
      - _neighbors 
       - _ptr 
        first 
       - second 
        - _neighbors 
        ... 

Apparemment, au lieu d'énumérer les 4 voisins du nœud avec index 0 la carte, elle liste son premier voisin, puis le premier voisin du premier voisin, puis son premier voisin et ainsi de suite ad infinity. En outre, à aucun moment, _neighbors n'apparaît sous forme de tableau, même s'il est déclaré comme tel.

J'ai trouvé un add-on appelé VSEDebug censé avoir un affichage STL amélioré, mais c'est pour VS2k3 et je n'ai pas pu le faire fonctionner en 2k8 (ni les binaires, ni la compilation moi-même).

La fenêtre immédiate n'est pas beaucoup d'aide non plus, comme essayer d'appeler _map.operator[] renvoie avec CXX0058: Error: overloaded operator not found.

Des idées comment je peux obtenir un affichage significatif du contenu de ma carte? Notez que je suis assez nouveau pour VS dans son ensemble, donc j'ai probablement besoin d'instructions détaillées. :)

+1

duplication possible: http://stackoverflow.com/questions/104959/what-is-the-best-way-to-inspect-stl-containers-in-visual-studio-debugging –

+0

VS 2008 pour moi montre des cartes très gentiment. – sbi

Répondre

2

Vous pouvez taper le nom du symbole dans la fenêtre de commande - fenêtre immédiate et commencer à suivre ses pointeurs membres. Par exemple, si vous déboguer un std :: vecteur nommé v et que vous voulez accéder à son élément en position 2, le type

* (v._Myfirst + 2)

Bien sûr, le membre _Myfirst dépend la mise en oeuvre. Mais je pense que vous avez l'idée. (Visual Studio a quelques problèmes résolvindo surcharges des opérateurs)

+0

'CXX0017: Erreur: symbole" _Monpremier "non trouvé'. J'ai essayé de chercher quelque chose de similaire, mais tous les affichages VS pour la carte sont les éléments qu'elle contient. Comment puis-je savoir ce que '_Myfirst' est appelé dans ma mise en œuvre? Est-ce garanti d'exister? – suszterpatt

+0

Il doit y avoir un membre interne dans votre structure de données qui pointe vers l'élément. Si votre carte s'appelle * m *, commencez par taper * m * dans la fenêtre de commande. – dudewat

1

Vous pouvez vous essayer à écrire un visualiseur personnalisé si vous le souhaitez, mais vous pourriez finir par dupliquer des fonctionnalités qui existent déjà quelque peu. Voici un article qui va sur les bases:

http://www.virtualdub.org/blog/pivot/entry.php?id=120

Si vous voulez juste voir tous vos éléments de tableau, vous pouvez taper « _MAP [0] .second._neighbors, 4 » dans la fenêtre montre rapide pour voir C'est un tableau de quatre, mais ce n'est pas exactement la chose la plus rapide au monde.

+0

'_map [0]' renvoie avec 'CXX0058: Erreur: opérateur surchargé non trouvé'. La note de dudewat concernant VS et les opérateurs semble appropriée – suszterpatt

+0

Vous pouvez aussi essayer "_map.find (0) .second._neighbors, 4" bien que cela ne soit pas garanti pour fonctionner (surtout si aucun élément n'existe avec cette clé). –

Questions connexes