我正在学习STL并制作了win32项目..
但是我遇到了运行时错误..
我尝试调试它但是..
(部分代码)
vector<Vertex> currPoly=polygons.back();
vector<Vertex>::iterator it;
for(it=currPoly.begin();it!=currPoly.end();++it){
vector<Vertex>::iterator p1;
vector<Vertex>::iterator n1;
vector<Vertex>::iterator n2;
if( it==currPoly.begin()){
p1=currPoly.end();
n1=it+1;
n2=it+2;
}else if( it==currPoly.end()-1){
p1=it-1;
n1=it+1;
n2=currPoly.begin();
}else if( it==currPoly.end()){
p1=it-1;
n1=currPoly.begin();
n2=currPoly.begin()+1;
}else{
p1=it-1;
n1=it+1;
n2=it+2;
}
int tmp;
tmp=it->x;
tmp=p1->x;
请click查看调试图片
这很奇怪,因为
在观察表中,
n1,p1,它被定义但是n2不是 和tmp也不是..
我找不到有什么问题......
请帮助..
答案 0 :(得分:1)
你应该更确切地了解你的问题是什么......
如果您想知道为什么n1
和tmp
的值无法在调试器中显示,我猜这是因为您正在调试发布版本(或者某些版本)使用优化构建的类型,并且编译器可能已经在执行流程中的那一点“优化掉”那些变量(它决定它们不再被使用或者它们的值可以在其他地方获得)。
尝试调试非优化版本。
顺便说一句,错误CXX0017(这是调试器为这些变量显示的内容)意味着“Expression Evaluator Error”。
答案 1 :(得分:0)
您是否保证多边形总是至少有3个点?另外,仔细看看你的第一个if。你还记得那个结尾()是结束的吗? (你似乎很喜欢,但可能存在某些地方出现问题的地方......)
答案 2 :(得分:0)
作为说明:
}else if( it==currPoly.end()){
p1=it-1;
n1=currPoly.begin();
n2=currPoly.begin()+1;
}
这绝不会发生。
int tmp;
tmp=it->x;
tmp=p1->x;
这看起来有点无意义。
答案 3 :(得分:0)
你仍然遇到currPoly.end()没有指向有效元素的想法。 最后一个有效元素后,end()指向一个。
因为您使用向量作为环,所以在向量中使用整数索引实际上是编写代码的更好方法。您可以根据矢量大小修改索引,而不是编写特殊情况代码。但是既然你要学习STL,我们就会坚持使用迭代器。这就是我认为正确的代码应该是什么样的(我没有编译它以查看它是否有效):
vector<Vertex> currPoly=polygons.back();
vector<Vertex>::iterator it;
for(it=currPoly.begin();it!=currPoly.end();++it){
vector<Vertex>::iterator p1;
vector<Vertex>::iterator n1;
vector<Vertex>::iterator n2;
if(it==currPoly.begin()){
p1=currPoly.end()-1;
n1=it+1;
n2=it+2;
}else if(it==currPoly.end()-1){
p1=it-1;
n1=currPoly.begin();
n2=n1+1;
}else if(it==currPoly.end()-2){
p1=it-1;
n1=it+1;
n2=currPoly.begin();
}else{
p1=it-1;
n1=it+1;
n2=it+2;
}
int tmp;
tmp=it->x;
tmp=p1->x;
}
这就是我认为基于索引的版本看起来像(再次,没有用编译器检查):
vector<Vertex> currPoly=polygons.back();
for(int i=0; i < currPoly.size(); ++i){
int p1 = (i+currPoly.size()-1)%currPoly.size();
int n1 = (i+1)%currPoly.size();
int n2 = (i+2)%currPoly.size();
int tmp;
tmp=currPoly[i].x;
tmp=currPoly[p1].x;
}