Как указывает 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
никогда не поднимаются выше их пороговых значений, а затем добавить некоторый код для проверки этих состояний и не входить в цикл.