Visual C++ à trouver la ligne qui provoque “Debug Assertion failed”
J'essaye de faire un programme en C++ qui fonctionne très bien lorsqu'il est compilé avec gcc pour fonctionner correctement sur Visual C++. Mon problème est que je suis maintenant le message d'erreur suivant:
Debug Assertion Failed!
Program: C:\WINDOWS\SYSTEM32\MSVCP110D.dll
File: c:\program files (x86)\microsoft visual studio 11.0\vc\include\vector
Line: 1140
Expression: vector subscript out of range
Mon réel problème est que je ne sais pas où cela se produit. En appuyant sur pause dans la fenêtre d'erreur, je suis simplement pris de la part de la classe vector où l'exception qui s'est passé en fin de compte. Je veux trouver de la place dans mon application qui, en fait, il a causé. J'ai réussi à le réduire à ce bloc de code:
for(unsigned int i=0;i<openPolygonList.size();i++)//error somewhere in here
{
if (openPolygonList[i].size() < 1) continue;
for(unsigned int j=0;j<openPolygonList.size();j++)
{
if (openPolygonList[j].size() < 1) continue;
Point diff = openPolygonList[i][openPolygonList[i].size()-1] - openPolygonList[j][0];
int64_t distSquared = vSize2(diff);
if (distSquared < 2 * 2)
{
if (i == j)
{
polygonList.push_back(openPolygonList[i]);
openPolygonList.erase(openPolygonList.begin() + i);
}else{
for(unsigned int n=0; n<openPolygonList[j].size(); n++)
openPolygonList[i].push_back(openPolygonList[j][n]);
openPolygonList[j].clear();
}
}
}
}
Le simple fait de placer des points d'arrêt à chaque ligne où un vecteur est utilisé n'est pas une option parce que itération de la boucle des milliers de fois et avoir à appuyer sur continuer à chaque fois va littéralement me prendre des heures. Est-il possible que je peux dire le débogueur de frein sur la ligne appropriée une fois que l'erreur se produit. Il peut m'aider à inspecter les variables et de déterminer quelle variable est hors de portée?
Vous pouvez également indiquer à visual casser seulement après
i > something
par exemple. C'est un point d'arrêt avec une condition.Désolé, je suis abit nouveau à VC++, pourriez vous juste m'expliquer comment cela devrait être fait?
Déboguer votre programme, et quand il les pauses, regardez la fenêtre qui est par défaut sur le coin inférieur droit de la fenêtre visuelle. Il doit avoir une "Pile d'Appel" de l'onglet. De l'ouvrir et de commencer par le haut (où vous devriez trouver une petite flèche), et la recherche de la première fonction que vous avez réellement écrit.
Vous cliquez droit sur votre point de rupture et que vous avez
Condition
et vous pouvez saisir ici une condition.OriginalL'auteur Gerharddc | 2013-06-24
Vous devez vous connecter pour publier un commentaire.
Je pense que le problème, c'est que vous êtes effacement des membres du vecteur vous êtes à itérer. Qu'advient-il si vous effacez le premier élément?
i 1 2 3
L'ie v1 v2 v3
Si l'on supprime 1 lorsque i = 1, le vecteur des indices et des valeurs ci-dessous et maintenant i = 2.
i 1 2
L'ie v2 v3
En fin de compte, je pense que vous pouvez itérer-delà de la fin du vecteur à l'origine d'avoir un pointeur qui pointe au delà de la fin du vecteur. Complet de la conjecture ici, mais il y a probablement un moyen plus facile de faire ce que vous essayez de faire. Je n'arrive pas à comprendre ce que vous essayez de faire.
Il semble que vous essayez d'inverser les lignes et les colonnes d'un tableau à deux dimensions, tandis que le stockage de la diagonale des polygones, il int tableau dans un nouveau tableau. De toute façon, oui, mais un cercle rouge au début de la boucle et de marcher à travers votre code ligne par ligne.
Je voudrais créer temp vecteurs et ensuite modifier ceux qui sont dans la boucle, puis de remplacer le vecteur openPolygonList.
OriginalL'auteur Chemistpp
Le débogueur ne peut pas prédire l'avenir, mais vous pouvez dire à la briser sur tous exceptions, (ctrl+atl+e et cocher toutes les cases sous "Levée"). Lorsque l'assertion se produit à pied en bas de la pile des appels de votre code, il va vous dire la ligne qui est à l'origine du problème.
OriginalL'auteur doctorlove
Vous pouvez ouvrir la fenêtre pile des appels (Debug->windows->de la Pile) et à trouver l'endroit dans votre programme qui a abouti à l'affirmation.
Il devrait être de 2 ou 3 lignes en dessous de la ligne du haut.
OriginalL'auteur kovarex