int inc = swap ? 1 : -1;
for(int j=j1; j!=j2; j+=inc){
if(j < 0)
j = curve2->controlPoints()->size()-1;
if(j >= curve2->controlPoints()->size())
j = 0;
curve->addControlPoint(curve2->controlPoint(j)->pos(), curve2->controlPoint(j)->triangle());
}
我发现在某些情况下,这是无限的循环。当使用调试器查看时,J确实达到了J2,但出于某种原因继续循环。
我然后尝试在循环内的j == j2(从技术上开始j = j-inc)尝试添加休息时间(因为j再次进入循环时会增加)
for(int j=j1; j!=j2; j+=inc){
if (j - inc == j2)
{
qDebug() << "break =================================";
break;
}
if(j < 0)
j = curve2->controlPoints()->size()-1;
if(j >= curve2->controlPoints()->size())
j = 0;
curve->addControlPoint(curve2->controlPoint(j)->pos(), curve2->controlPoint(j)->triangle());
}
这样做确实解决了问题(确实是印刷的"断裂"),但这没有任何意义吗?为什么第一个循环以这种方式行动?
编辑:我在列表的一部分(值J1和2之间)进行迭代。迭代可以根据交换参数(布尔)的两侧进行。如果J到达列表的末端之一,则将继续在另一侧(例如J1 = 5,J2 = 1,列表大小为7,J将采用以下值:5 6 0 1)
应该指出的是,我只是猜测在这里发生了什么...
我的猜测是,j
通过其中一个分配在循环中等于j2
。但是随后增加j += inc
的增加,并且在检查环条件时j
不再等于j2
。
一般来说,for
循环等效于while
循环:
for (a; b; c)
d
等于
{
a;
while (b)
{
d;
c;
}
}
这意味着您的第一个循环等于(添加了额外的评论)
{
int j = j1;
while (j != j2)
{
if(j < 0)
j = curve2->controlPoints()->size()-1;
if(j >= curve2->controlPoints()->size())
j = 0;
curve->addControlPoint(curve2->controlPoint(j)->pos(), curve2->controlPoint(j)->triangle());
// At this point `j == j2`, so the loop condition is false
// BUT then you do
j += inc;
// Here `j != j2` again, and the loop condition is true and will continue
}
}
也许您的循环条件应该是j - inc == j2
?