该程序似乎没有退出循环。这是为什么?

时间:2019-06-02 13:28:03

标签: c loops

这是一个简单的for循环,程序无法退出。

for(j=4;j<8;j++)
{
    label4:
    b=(rand()%100+1)/1000;
    temp1a[l]=(chrom[i][j]*(0.1-b))+(b*chrom[i+1][j]);
    temp2a[l]=(chrom[i+1][j]*(0.1-b))+(b*chrom[i][j]);
    if(temp1a[l]>0.1&&temp2a[l]>0.1)
    {
        l++;
        continue;
    }
    else
    {
        goto label4;
    }
}
printf("Initial temp arrays stored\n");

未打印end语句,并且没有输出。有人可以帮我吗。

4 个答案:

答案 0 :(得分:2)

  

b=(rand()%100+1)/1000;

(rand()%100+1)/1000部分产生0。 净效果:

b = 0;

答案 1 :(得分:0)

goto label4可能是罪魁祸首。

循环中的第一行是标签。它什么也没做,只是对编译器说:“代码中的这个位置称为label4”。然后,在循环的稍后,if语句失败,因此执行代码goto label4

这导致代码跳回到label4。某种原因导致if语句永远不会成功,因此代码将永远跳回到label4(循环的开始)。

答案 2 :(得分:0)

pmg指出,由于在除法运算中使用了所有整数操作数,因此您总是将0分配给b。这可能是造成问题的原因。

根据您的逻辑,您似乎不想递增j,除非l也递增了,只有在temp1a[l]temp2a[l]在上方时才会发生阈值为0.1

有一种更好的方法来构造代码,以使您不需要continuegoto语句:

for(j=4;j<8;j++)
{
    do
    {
      b=(rand()%100+1)/1000.0;  // note at least one floating-point operand
      temp1a[l]=(chrom[i][j]*(0.1-b))+(b*chrom[i+1][j]);
      temp2a[l]=(chrom[i+1][j]*(0.1-b))+(b*chrom[i][j]);
    } while (temp1a[l] <= 0.1 || temp2a[l] <= 0.1)
    l++;
}

这将为b计算一个新值,并执行后续计算,只要其中一个结果低于0.1的阈值。如果两者都在0.1以上,则退出内部循环,并且l递增。然后,外循环再次执行。

现在,根据chrom中的内容,您仍然有可能遇到内循环永不退出的情况。您需要进行一些分析,以查看导致temp1atemp2a从未达到其阈值的状态的解决方案,然后添加一些代码来检查这些状态而不进入循环。

答案 3 :(得分:-1)

我忘了随机播种

 srand(time(0));

所以程序总是为b提供相同的值,因此它变成了无限循环。