187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
||||||
1 | ||||||
Выйти из нескольких функций03.01.2014, 10:03. Показов 4105. Ответов 22
Метки нет (Все метки)
Необходимо при определенном условии выскочить из косвенной рекурсии. Конечно, можно сделать это монструозно, но, полагаю, есть возможность выйти изо всех эти функций безо всяких глобальных переменных и тучи if при каждом косвенном вызове на проверку этого глобального флага?
Исключения использовать нельзя. Я бы сделал это через goto, но насколько это правильно? Разворачивает ли goto стэк? Мне кажется, что нет.. Но может я ошибаюсь? Так бы это выглядело с goto:
Не по теме: Пожалуйста, не надо кричать "использование goto = быдло код"..
0
|
03.01.2014, 10:03 | |
Ответы с готовыми решениями:
22
Условия для нескольких функций Работа с файлом из нескольких функций Возвращение из функций нескольких значений Объявление нескольких функций в head.h |
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
03.01.2014, 10:05 | 2 |
Исключение можно кинуть)
Но я даже не знаю что тут большее зло: логика на исключениях или goto. Мысль первая: давайте жить без рекурсии. Мысль вторая: если по каким-либо причинам нельзя, можно попробовать передавать последним аргументом какой-нибудь флаг по ссылке.
0
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
03.01.2014, 10:14 [ТС] | 3 |
0x10,
а прочитать сначала сообщение?
Да и так забавно, когда описываешь задачу, а тебе говорят:"изменяй условия задачи! Не используй это и это, а используй это и это" :\
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
03.01.2014, 10:18 | 4 |
Проглядел, да.
Добавлено через 3 минуты А что касается goto - сделать-то можно, только не так просто, как в примере. Поэтому лучше не надо.
1
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
03.01.2014, 10:32 [ТС] | 5 |
0x10, поэтому и спрашиваю, какие есть алтернативы, может я не знаю о каком-то gotoThroughFunctions
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
03.01.2014, 10:55 | 6 |
Каждый экземпляр каждой функции должен завершаться, согласно логике этой функции, всё остальное - костыли. Если тебе надо во вложенном экземпляре выйти из всей рекурсии, то единственный правильный вариант - заставить все вышележащие по цепочке функции завершаться сразу же при возврате из нижележаших. Выполнилось условие, функция завершается возвращает такое (в параметре, или в значении самой функции), что вызвавшая функция её тоже завершается с аналогичным возвратом. И ни какой записи в глобальным переменные из рекурсии.
0
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
03.01.2014, 10:56 [ТС] | 7 |
taras atavin, и будет такая туча ненужных проверок, что капец. Если функции друг из друга вызываются в -ндцати местах, то нужно добавить столько же if после них - не вариант. Вызывать функции друг из друга один раз не выйдет по упомянутой вами выше логике программы. Так же, как я говорил, не стоит писать о "каждая функция должна завершаться в соответствие её логике и это, мол, костыль", ибо по логике программы (да-да, щас начнут писать, что значит программа составлена неверно, раз такая логика) обязан быть именно такой выход, именно из косвенной рекурсии и, желательно (очень-очень), безовсяких дополнительных if. Это как добавить exit(nError) в функцию проверки на критические ошибки, вместо задания флага, что ошибка была и соответствующей проверки после функции обработки.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
03.01.2014, 10:58 | 8 |
Ни одной не нужной проверки не будет.
Добавлено через 1 минуту Не важно, в скольких местах одна функция вызывает другую, return завершит её в любом месте.
1
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
03.01.2014, 11:10 | 10 | |||||
Не будет ни одного лишнего if. Каждый экземпляр вызывает два других в двух местах, найди костыль, лишний if и монструозность:
1
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
||||||
03.01.2014, 11:16 [ТС] | 11 | |||||
Tulosba, ой, плохой пример привел.
Немного отредактирую: функция возвращает bool, если взяла на себя работу и false, если не может обработать некоторые данные. Выпрыгнуть из всей рекурсии надо тогда, когда данные удовлетворяют некоторому условию. Не имеет разницы, что вернут функции (и вернут ли они вообще что-то) в этом случае.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
03.01.2014, 11:27 | 12 |
Можно, кстати, и в макрос запихать условный return. Параметр макроса подставляется в правую часть оператора присваивания и если присвоилось true, то return. А выход из рекурсии с разворотом стека можно делать только при низкоуровневой оптимизации, пока до неё не дошёл, всякий выход из рекурсии должен быть возвратом из всех экземпляров всех функций по цепочке.
1
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
03.01.2014, 11:49 [ТС] | 13 |
taras atavin, исключения бы подходили идеально, но использовать их нельзя ;d
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
03.01.2014, 13:09 | 14 |
Согласен, но так делать не надо.
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||||||
03.01.2014, 13:39 | 15 | |||||
Потому что надуманный.
По коду видим чередование f1, f2. Отсюда, как мне кажется, имеет смысл реализовать вовсе без рекурсии, циклом:
0
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
03.01.2014, 13:47 [ТС] | 16 |
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
03.01.2014, 13:53 | 17 |
0
|
2719 / 1773 / 187
Регистрация: 05.06.2011
Сообщений: 5,132
|
|
03.01.2014, 14:04 | 19 |
Ну, в Цэ есть ещё setjump/longjump, так, кажись. По сути дела, исключения для бедных — для бедных Цэшников. Если и этого нельзя, только if — насколько помню, обычный goto разрешён только в пределах одной функции. Именно потому, что не делает возвратов.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
03.01.2014, 14:10 | 20 |
Если ты корень диска что то кинул, то это ещё не значит, что и остальные поступили также. У линуксоидов, например, нет самого диска. Да и на винде очень не рекомендуется захламлять корень.
0
|
03.01.2014, 14:10 | |
03.01.2014, 14:10 | |
Помогаю со студенческими работами здесь
20
Решение задачи с применением нескольких функций Программирование задач с использованием нескольких функций Программа с возвратом из функций нескольких значений Шаблоны функций при компиляции нескольких файлов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |