【发布时间】:2019-03-08 12:52:11
【问题描述】:
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());
}
我发现在某些情况下,这个 for 无限循环。使用调试器查看时,j 确实到达了 j2,但由于某种原因继续循环。
然后我尝试在循环内添加一个中断 if j == j2(技术上是 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());
}
这样做确实解决了问题(并且确实打印了“中断”),但这真的没有任何意义吗? 为什么第一个 for 循环会这样?
编辑: 我正在遍历列表的一部分(值 j1 和 2 之间)。根据交换参数(布尔值),迭代可以同时进行。如果 j 到达列表的末尾之一,它会在另一侧继续(例如,如果 j1=5,j2=1 并且列表大小为 7,j 将采用以下值:5 6 0 1)
【问题讨论】:
-
您在循环内修改
j。如果该修改导致j != j2从不为真,会发生什么? -
那么
j1、j2和swap的值是什么?您在循环内为j分配了哪些可能的值?你调用的任何函数会修改j2吗?请创建minimal reproducible example 向我们展示。并且请在循环中迭代时使用调试器检查实际值。 -
正如我所说,我在迭代循环时使用调试器检查实际值,j 确实等于 j2,但它仍然没有离开循环。
-
我们看不到调试器的输出,因此您需要向我们展示一个完整的示例。我们无法修复我们看不到的代码。阅读minimal reproducible example
-
您似乎认为增量发生在条件测试之后,但顺序实际上相反。