#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, вам не нужно сбрасывать, поскольку поток ошибок не буферизуется (потому что при отладке вы хотите знать все, что было напечатано).