C для цикла, который не завершается

#c #for-loop #break

#c #для цикла #перерыв

Вопрос:

В моей программе есть цикл for, очень простой, и я хочу, чтобы он выполнял цикл и делал что-то некоторое минимальное количество раз. Однако цикл просто … останавливается. Но не переходит к следующему элементу программы. Например, когда min равно 9, он выполняется от i = 0 до i = 8, а затем зависает. Он должен выйти из цикла for, но он не выполняет следующую команду печати и не выполняет цикл снова. Он просто останавливается. Программа зависает, абсолютно ничего не делая, насколько я могу судить. Я не понимаю, почему это так.

Функция merged.put(), которую я хочу выполнить, просто помещает x или y в merged, в зависимости от условия. Эта часть работает. Это всего лишь небольшая часть гораздо большей программы. sp1, sp2 и merged определены в другом месте.

 int i;
    int x;
    int y;
    for(i=0; i < min; i  )
    {
        cout << " here "   convert(i);
        x = sp1.get_num(i);
        y = sp2.get_num(i);
        if(x >= y) {
            merged.put(x);
        }
        else {
            merged.put(y);
        }
        cout << " end" << endl;
    }
cout << "out";
  

РЕДАКТИРОВАТЬ: я не публикую весь код, он длиной в несколько сотен строк. Тип min — int . Ответ там был полезен, когда << endl был добавлен к последнему оператору печати, он печатался. Теперь моя проблема, похоже, здесь, застряла на втором этапе, потому что я не увеличивал i. Позор мне…спасибо за помощь. (Это происходит непосредственно после приведенного выше кода)

 if (sp_large == 2) {
        cout << "1" << endl;;
        while (i < sp2.get_size()) {
            merged.put(sp2.get_num(i));
        }
    }
    else {
        while (i < sp1.get_size()) {
            merged.put(sp1.get_num(i));
        }   
        cout << "2" << endl;
    }
  

РЕДАКТИРОВАТЬ: проблема решена, спасибо за помощь.

Комментарии:

1. Вы уверены, что проблема заключается в опубликованном вами коде? Похоже, проблема возникает позже, но вы не видите сообщение «out», потому что оно не сбрасывается до того, как все, что происходит дальше, зависает. Добавьте << endl в свой второй print и попробуйте свой код еще раз.

2. Я не вижу ничего явно неправильного в коде, поэтому постарайтесь исключить подозреваемых: закомментируйте вызовы get_num и / или merged и присваивайте значения x и y напрямую. Это что-нибудь меняет? Если это так, нам нужно исследовать, что происходит в этих вызовах.

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

4. Что будет после count << "out"; ? Возможно, программа висит там (и «выход» ожидает где-то в буфере).

5. может быть sp1.get_num(i) или sp1.get_num(i) выдает исключение, когда i = 8, отладьте его.

Ответ №1:

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

Эта строка:

 cout << "out";
  

просто помещает «out» в выходной буфер и фактически не выводит «out», пока выходной буфер не будет очищен. (Что может произойти немедленно, но маловероятно.) Измените эту строку на эту:

 cout << "out" << endl;
  

и «out» будет напечатано, как только эта строка будет запущена. Это поможет вам выяснить, зависает ли программа до того, как она доберется до этой строки, или где-то позже.

Комментарии:

1. Если это так, то это ошибка во время выполнения c , и я так не думаю.

2. Это не ошибка во время выполнения, просто так работает буферизованный вывод. 1

3. Он прав, когда я добавил endl, он напечатал. Я работаю над попыткой снова сузить проблему. Я не знал, что буферизованный вывод работает таким образом.

4. Используйте std:flush вместо std::endl , если вам не нужен перевод строки.

5. Если вы используете std::cerr, вам не нужно сбрасывать, поскольку поток ошибок не буферизуется (потому что при отладке вы хотите знать все, что было напечатано).