![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
ACM!
Форумчанин
Регистрация: 19.06.2009
Сообщений: 382
|
![]()
Есть рекурсивная функция, которая становится бесконечной, если пользователь ввел неверные данные. Причем заранее проверить их правильность невозможно (только в ходе рекурсии). Подумал, что можно засекать время выполнения (> 2 сек значит прерывать) На Делфи я бы написал GetTickCount и сравнивал в процедуре. Но надо в Паскале или на крайняк во ФриПаскале. Если там что-нибудь такое?
|
![]() |
![]() |
![]() |
#2 |
Trust no one.
Старожил
Регистрация: 07.04.2009
Сообщений: 6,526
|
![]()
Попробуйте поставить прерывание не на время (которое будет скакать в зависимости от мощности компьютера), а на количество выполнений функции. Введи глобальную переменную типа байт и внутри рекурсии делай inc(I). Если I = 200 - прерывай. В "нейтральном" положении I:=0;
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ |
![]() |
![]() |
![]() |
#3 |
ACM!
Форумчанин
Регистрация: 19.06.2009
Сообщений: 382
|
![]()
Спасибо! Самое что интересное, такая переменная уже была, она использовалась для нумерации, а я что-то не подумал ее использовать
![]() |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
аналог GetTickCount в TurboPascal делается элементарно:
Код:
но вообще-то, привязываться к времени выполнения - не логично и не эффективно, гораздо лучше поступить так, как предложил Alex Cones - считать вложенность вызовов... |
![]() |
![]() |
![]() |
#5 |
C++
Форумчанин
Регистрация: 27.03.2011
Сообщений: 803
|
![]()
Лучше по-другому делать. Если данные в ходе последней итерации не изменились - значит началась бесконечная рекурсия - нужно прервать функцию. Иначе, попросту, можно ложно диагностировать проблему.
Ищете информацию по C++?
cplusplus.com |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
Сtrl
1) Вы зря поднимаете тему двухгодовой давности! (и как только Вы её нашли?! ![]() 2) Автор вопроса уже, судя по всему решил свою проблему. В подобных случаях подсчёт глубины вызовов - это самое "милое" дело (счётчик вызовов). 3) Ваш совет не очень корректен. что есть данные в рекурсивной функции? Рекурсивная функция может, например, обходить связный список. А он может быть закольцован... Да и в вычислениях есть случаи, когда ряд рассходится - т.е. каждый раз данные разные - а окончания цикла не предвидится... Кстати, скорее всего подобный бесконечный рекурсивный вызов функции/процедуры закончится переполнением стека... Последний раз редактировалось Serge_Bliznykov; 14.05.2011 в 08:02. |
![]() |
![]() |
![]() |
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Сайт с задачами для Паскаля | k1r1ch | Свободное общение | 2 | 11.11.2009 19:46 |
Аналог функции GetObject из VB для Делфи? | Stilet | Общие вопросы Delphi | 1 | 29.04.2009 17:46 |
C# проблема с GetTickCount | igroman | Общие вопросы .NET | 1 | 09.01.2009 09:37 |
Задача для паскаля. | Анжелика | Помощь студентам | 6 | 27.10.2008 18:13 |
Задача для гениев Паскаля | Улица | Помощь студентам | 1 | 22.05.2008 13:56 |