这是一个简单的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语句,并且没有输出。有人可以帮我吗。
答案 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
。
有一种更好的方法来构造代码,以使您不需要continue
或goto
语句:
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
中的内容,您仍然有可能遇到内循环永不退出的情况。您需要进行一些分析,以查看导致temp1a
或temp2a
从未达到其阈值的状态的解决方案,然后添加一些代码来检查这些状态而不进入循环。
答案 3 :(得分:-1)
我忘了随机播种
srand(time(0));
所以程序总是为b提供相同的值,因此它变成了无限循环。