Программа, похоже, не выходит из цикла.Это почему? - PullRequest
0 голосов
/ 02 июня 2019

Это простой цикл 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 ]

2 голосов
/ 02 июня 2019

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

(rand()%100+1)/1000 часть дает 0.Чистый эффект:

b = 0;
0 голосов
/ 02 июня 2019

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

0 голосов
/ 02 июня 2019

Я забыл посеять случайное число, т.е.

 srand(time(0));

, поэтому программа всегда давала одно и то же значение для b, следовательно, она стала бесконечным циклом.

0 голосов
/ 02 июня 2019

goto label4, вероятно, виновник.

Первая строка внутри цикла - это метка. Он ничего не делает, он просто говорит компилятору: «Это место в коде называется label4». Затем, позже в цикле оператор if не выполняется, поэтому выполняется код goto label4.

В результате код возвращается к label4. Что-то заставляет оператор if никогда не завершаться успешно, и поэтому код вечно возвращается к метке label4 (начало цикла).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...