Как определить зацикливание программы?
Есть программы, которые требуют очень много времени для своей работы
В связи с этим возникло несколько вопросов.
1. Как вы определяете, что программа работает?
2. Как вы определяете, что программа зациклилась?
3. Ваша программа выдает какие-то данные о том что она работает?
4. Ваша программа извещает вас. сколько ей осталось работать?
5. Вы оцениваете время работы программы перед ее запуском?
6. Ваша программа может сама определить, что она зависла?
7. Ваша программа может сама остановиться?
8. Ваша программа остановилась. Объяснит она свою остановку?
полагаю, этого достаточно.
Лучшие ответы ( 4 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Метод Эйлера-Коши (как прервать зацикливание программы)
Подскажите, пожалуйста, как прервать зацикливание данной программы: clear; a=1; b=2; h=0,02;.
Как определить зацикливание процесса?
Собственно, сабж в названии. Как определить, что некоторая программа другого процесса зациклилась.
Как наиболее быстро определить зацикливание связанного списка? (a => b => c => d => e => a)
You have a pointer to some element in a linked list (a => b => c => d => e). What is the fastest.
Зацикливание программы
Как сделать так, чтобы программа запрашивала у пользователя, нужно ли еще раз решать то или иное.
3254 / 2056 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
Сообщение было отмечено йот как решение
Решение
1−3, 8 — решается логированием.
4 — если реализовать просто, то можно и сделать.
5 — в некоторых случаях могут быть ожидания относительно времени работы.
6 — в некоторых случаях возможно, смотря что понимать под зависанием.
На более конкретные вопросы будут более конкретные ответы.
27 / 32 / 14
Регистрация: 08.09.2017
Сообщений: 448
0x10,
допустим у меня обычный цикл с параметром скажем время
работы программы 1 час (условно), то я предпочитаю, чтобы
программа выносила на экран значение параметра цикла
(с каким нибудь шагом) — это все-таки определенная гарантия
того, что программа работает. заодно можно оценить время
работы.
А как поступаете вы в подобном случае или ином другом?
Добавлено через 5 минут
Зависание
Некоторые переменные должны обязательно менять
свое значение (можно поставить элементарный счетчик)
если переменная не меняет своего значения (хотя должна)
— 100%% гарантии того, что программа зависла.
3254 / 2056 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
Сообщение было отмечено йот как решение
Решение
Сообщение от йот
А как поступаете вы в подобном случае или ином другом?
Можно на каждой итерации, можно с выбранным шагом… Как удобно, зависит от конкретной задачи.
Сообщение от йот
Некоторые переменные должны обязательно менять
свое значение (можно поставить элементарный счетчик)
Утопия. За каждой переменной следить?
Можно после каждой итерации выставлять таймер на время, заведомо большее, чем ожидаемое время итерации, см alarm(2). Если процесс получил SIGALRM, значит, выполняется дольше ожидаемого. Если выполнение перешло на очередную итерацию — будильник будет переставлен на заданный интервал. Естественно, такой прием не спасет от всех бед. Так, процессы в состоянии uninterruptible sleep не могут быть прерваны сигналами.
Операторы управления циклом. Зацикливание
Существует два оператора, которые позволяют управлять выполнением цикла. Это операторы break и continue .
Давайте рассмотрим их работу на следующем примере: Модифицируем программу из прошлого урока.
Программа: Игральный кубик.
Программа заменяет обычный игральный кубик.
- 1 — бросить кубик;
- 0 — закончить игру.
Код такой программы будет выглядеть следующим образом:
#include #include #include int main(void) < srand(time(NULL)); printf("########### Devil\'s bones ###########\n"); printf("# #\n"); printf("# Commands: #\n"); printf("# #\n"); printf("# 1 - new game #\n"); printf("# 0 - exit #\n"); printf("# #\n"); printf("########################################\n\n"); int ch_control; int value = 0, score = 0; do < printf("Input command: "); scanf("%d", &ch_control); switch(ch_control)< case 0: score = score -1; break; case 1: value = 1 + rand()%6; printf("Result: %d\n", value); break; default: printf("Error! Try again. \n"); continue; // прерываем текущую итерацию цикла >score = score + 1; if(score == 50) < printf("Game over!\n"); break; // завершаем цикл >>while(ch_control != 0); printf("\n\nSCORE: %d\n\nGood bye!\n", score); return 0; >
Давайте поясню некоторые новые операторы, которые там используются.
Оператор break
Оператор break прекращает выполнение цикла. Помните, мы уже использовали данную команду в операторе switch . Здесь всё точно так же. Мы используем данный оператор, чтобы выйти из цикла, когда произойдёт 50 бросков. Важный момент. Оператор break работает и во всех циклических конструкциях, и в операторе выбора. В нашем примере он используется и там, и там. Возникает вопрос: а как он решает, откуда надо выйти: из switch или из цикла. Очень просто. Оператор break всегда завершает ближайший внешний оператор, внутри которого он находится. Например, в нашей программе первый раз оператор break встречается в ветке case 0 . Значит он находится внутри оператора switch , который находится внутри цикла do-while . Ближайший оператор, внутри которого он расположен, – это switch . Следовательно, завершается оператор switch . Аналогично и с другими ветками оператора switch . Последний оператор break находится внутри if , который находится внутри цикла do-while . Т.к. на конструкцию if оператор break не действует, то ближайшим оператором, в котором он находится, является цикл do-while . Поэтому в этом случае break завершает цикл.
Оператор continue
Данный оператор применяется только внутри циклов. Он позволяет прервать текущую итерацию цикла. После того, как компьютер встречает оператор continue , он завершает исполнение тела цикла и переходит к проверке условия (в циклах while и do-while ) или к изменению счётчика (выражение 3 в цикле for ). В нашей программе он используется для того, чтобы не учитывать плохие ходы. Например, пользователь ввёл число 2 . Программа выдаёт ему сообщение об ошибке и сразу же переходит к проверке условия. При этом все команды ниже пропускаются, а значит не увеличивается счётчик ходов, и не проверяется превышение предела в 50 ходов на игру. Если здесь убрать оператор, то после вывода сообщения об ошибке тело цикла продолжит выполняться дальше и увеличится счётчик ходов.
Зацикливание
Иногда бывает так, что условие, при котором работа цикла должна прекратиться, никогда не выполняется. В таких случаях говорят, что программа «зациклилась» . Зачастую это происходит при использовании циклов do-while и while . Пример: программа сложения пяти введённых чисел.
#include int main(void) < double sum = 0, temp = 0; int k = 0; do < scanf("%lf", &temp); sum = sum + temp; >while(k
На первый взгляд всё верно, но попробуйте скомпилировать и запустить эту программу. Вы заметите, что она не спешит останавливаться после того, как мы ввели первые пять чисел. Когда мы используем эти циклы, необходимо внимательно отслеживать, что переменные, входящие в условия цикла, в теле цикла хоть как-то изменяются. В нашем примере допущена именно такая ошибка. Условие записано верно, переменная k (счётчик считанных чисел) объявлена и инициализирована, но внутри тела цикла мы забыли её увеличить. Поэтому нашему условию окончания цикла k < 5 не суждено стать истинным. Не всегда подобные ошибки так очевидны, как в нашем случае. Поэтому будьте внимательны, когда используете циклы с условиями. Давайте приведем нашу программу в рабочее состояние:
#include int main(void) < double sum = 0, temp = 0; int k = 1; do < scanf("%lf", &temp); sum = sum + temp; k = k + 1; >while(k
Как определить зацикливание процесса?
Собственно, сабж в названии. Как определить, что некоторая программа другого процесса зациклилась? Или, допустим, имея свой процесс и полный лог того, что происходит в нём (выделение памяти, вызов любой функции и т.д), определись, что программа вошла в бесконечный цикл из-за возникшей где-то ошибки, хотя не должна была?
Помимо очевидного способа взять контекст из ~100 вызовов и проверять, пошли ли вызовы по второму кругу, но при этом состояния переменных не изменились?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как наиболее быстро определить зацикливание связанного списка? (a => b => c => d => e => a)
You have a pointer to some element in a linked list (a => b => c => d => e). What is the fastest.
Как определить зацикливание программы?
Есть программы, которые требуют очень много времени для своей работы В связи с этим возникло.
Как определить разрядность стороннего процесса
Добрый вечер, подскажите пж-та как можно определить разрядность стороннего процесса? Для своего.
Как определить границы памяти стороннего процесса?
Мне необходим пример c определением границ памяти стороннего процесса, по принципу работы .
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
Бесконечный цикл — это может быть вполне нормальная ситуация для программы. Взять любую GUI программу и там будет бесконечный цикл обработки сообщений пользователя/системы. Просто надо в контрольных точках получать ответы на служебные сообщения, если ответов нет, значит программа ходит по каким-то другим участкам кода и, вероятно, можно считать, что она зациклилась, т.к. такая ситуация не нормальна.
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
В общем случае и достоверно — никак. Проблема остановки же.
Программа может успешно отвечать на все эти служебные сообщения, но в то же время другой ногой висеть в бесконечном цикле.
Так что единственный вариант — это как-то определить, что программа выдаёт ошибочные данные (работает неправильно). Не используя при этом эту же программу.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Функция MsgWaitForMultipleObjects. Как определить handle завершившегося процесса
Здравствуйте, я запускаю несколько процессов, а затем жду пока один из них завершится. Вот.
Как определить PID процесса или имя по сети
Программа перехватывает с сетевого адаптера сетевые пакеты. Я возвращаю IP И порт . Как определить.
Как программно определить, что MsgBox от какого-либо процесса прорисовался
Например, нужно программно определить, что процесс regedit.exe выдал какое-нибудь сообщение(MsgBox).
Как сверить имя процесса и путь основного процесса?
Подскажите как мне сверить путь с именем процесса svchost.exe если файл запущен из папки System32.
При подготовке материала использовались источники:
https://www.cyberforum.ru/programming-theory/thread2043228.html
https://youngcoder.ru/lessons/7/upravlenie_ciklom.php
https://www.cyberforum.ru/cpp-beginners/thread1009986.html