Можно ли прервать рекурсивный вызов?

Темы связанные с инженерными разработками, но не подходящие в другие ветки форума
Ответить
Sergey Puzanov
assistant
assistant
Сообщения: 113
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 23 раза
Поблагодарили: 3 раза
Контактная информация:

Можно ли прервать рекурсивный вызов?

Сообщение Sergey Puzanov »

Есть рекурсивная VI, которая при правильных входных параметрах имеет максимум 5 глубину вложенности, при определённых неправильных - бесконечную. Можно ли на условно 6-7-ой итерации прервать выполнение и выдать ошибку и/или число? Спасибо.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Можно ли прервать рекурсивный вызов?

Сообщение Borjomy_1 »

Средствами среды - нет. Но можно номер итерации передавать как параметр и внутри vi контролировать это число. При вызове, соответственно, номер итерации увеличивать.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: Можно ли прервать рекурсивный вызов?

Сообщение Artem.spb »

Извратиться можно, но нужно ли?
Не проще ли проверить входные параметры на допустимость?
rec.png
Вложения
rec.vi
(9.85 КБ) 69 скачиваний
Sergey Puzanov
assistant
assistant
Сообщения: 113
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 23 раза
Поблагодарили: 3 раза
Контактная информация:

Re: Можно ли прервать рекурсивный вызов?

Сообщение Sergey Puzanov »

Borjomy_1 писал(а): 02 сен 2021, 23:03 Средствами среды - нет. Но можно номер итерации передавать как параметр и внутри vi контролировать это число. При вызове, соответственно, номер итерации увеличивать.
Тоже думал об этом, попробуем.
Artem.spb писал(а): 02 сен 2021, 23:40 Не проще ли проверить входные параметры на допустимость?
Они сами по себе будут допустимыми, но один заданный параметр может "ссылаться" на другой, а он в свою очередь на первый, и проверка всех вариантов точно не будет проще.

Так что извращаемся :dance:
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Можно ли прервать рекурсивный вызов?

Сообщение IvanLis »

Sergey Puzanov писал(а): 03 сен 2021, 08:27 Так что извращаемся :dance:
А для чего Вам рекурсия если Вы ее не можете контролировать.
Всегда можно без нее обойтись.
Посмотрите viewtopic.php?f=23&t=5578&p=46330
Sergey Puzanov
assistant
assistant
Сообщения: 113
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 23 раза
Поблагодарили: 3 раза
Контактная информация:

Re: Можно ли прервать рекурсивный вызов?

Сообщение Sergey Puzanov »

IvanLis писал(а): 03 сен 2021, 22:37
А для чего Вам рекурсия если Вы ее не можете контролировать.
Всегда можно без нее обойтись.
Посмотрите viewtopic.php?f=23&t=5578&p=46330
Так в этом и вопрос был - как её контролировать. Обойтись можно и без неё, но при контроле она ничем не хуже обычных способов, которые могут быть ещё более извращенными.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Можно ли прервать рекурсивный вызов?

Сообщение IvanLis »

Sergey Puzanov писал(а): 06 сен 2021, 11:41 Так в этом и вопрос был - как её контролировать. Обойтись можно и без неё, но при контроле она ничем не хуже обычных способов, которые могут быть ещё более извращенными.
:wink: ну так если у Вас проблемы возникли, то контроль не удачен.
Sergey Puzanov писал(а): 02 сен 2021, 16:59 имеет максимум 5 глубину вложенности
Можно например по этому параметру контролировать, т.е. это фактически аварийный выход получится, если другие проверки не сработают.
Функция имеет входной параметр "глубина". С каждым вызовом "вглубь" нужно делать +1 и передавать параметр на следующий уровень. А если значение превышает заданное, то последующие шаги в глубину не выполнять.
Ответить

Вернуться в «Общие»