Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Выйти из нескольких функций - C++

03.01.2014, 10:03. Просмотров 1188. Ответов 22
Метки нет (Все метки)

Необходимо при определенном условии выскочить из косвенной рекурсии. Конечно, можно сделать это монструозно, но, полагаю, есть возможность выйти изо всех эти функций безо всяких глобальных переменных и тучи if при каждом косвенном вызове на проверку этого глобального флага?
Исключения использовать нельзя.

Я бы сделал это через goto, но насколько это правильно? Разворачивает ли goto стэк? Мне кажется, что нет.. Но может я ошибаюсь?

Так бы это выглядело с goto:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void f1()
{
f2();
}
void f2()
{
if (..)
goto HERE;
f1();
}
int main()
{
f1();
HERE:
doSomethingElse();
}

Не по теме:

Пожалуйста, не надо кричать "использование goto = быдло код"..

Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2014, 10:03     Выйти из нескольких функций
Посмотрите здесь:

Выйти из goto. C++
C++ Функция, в функции main() или общие переменные для нескольких функций
Решение задачи с применением нескольких функций C++
C++ как выйти из программы
C++ Подключение с помощью директивы #include нескольких функций, находящихся в разных файлах.
C++ Написать набор функций, обслуживающих блочно-диагональные матрицы из нескольких нижне-треугольных блоков
Возвращение из функций нескольких значений C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
03.01.2014, 10:05     Выйти из нескольких функций #2
Исключение можно кинуть)
Но я даже не знаю что тут большее зло: логика на исключениях или goto.

Мысль первая: давайте жить без рекурсии.
Мысль вторая: если по каким-либо причинам нельзя, можно попробовать передавать последним аргументом какой-нибудь флаг по ссылке.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
03.01.2014, 10:14  [ТС]     Выйти из нескольких функций #3
0x10,
Цитата Сообщение от nexen Посмотреть сообщение
Исключения использовать нельзя.
а прочитать сначала сообщение?

Да и так забавно, когда описываешь задачу, а тебе говорят:"изменяй условия задачи! Не используй это и это, а используй это и это" :\
0x10
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
03.01.2014, 10:18     Выйти из нескольких функций #4
Проглядел, да.

Добавлено через 3 минуты
А что касается goto - сделать-то можно, только не так просто, как в примере. Поэтому лучше не надо.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
03.01.2014, 10:32  [ТС]     Выйти из нескольких функций #5
0x10, поэтому и спрашиваю, какие есть алтернативы, может я не знаю о каком-то gotoThroughFunctions
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
03.01.2014, 10:55     Выйти из нескольких функций #6
Цитата Сообщение от nexen Посмотреть сообщение
Необходимо при определенном условии выскочить из косвенной рекурсии. Конечно, можно сделать это монструозно, но, полагаю, есть возможность выйти изо всех эти функций безо всяких глобальных переменных и тучи... Я бы сделал это через goto, но насколько это правильно? Разворачивает ли goto стэк? Мне кажется, что нет.. Но может я ошибаюсь?
Каждый экземпляр каждой функции должен завершаться, согласно логике этой функции, всё остальное - костыли. Если тебе надо во вложенном экземпляре выйти из всей рекурсии, то единственный правильный вариант - заставить все вышележащие по цепочке функции завершаться сразу же при возврате из нижележаших. Выполнилось условие, функция завершается возвращает такое (в параметре, или в значении самой функции), что вызвавшая функция её тоже завершается с аналогичным возвратом. И ни какой записи в глобальным переменные из рекурсии.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
03.01.2014, 10:56  [ТС]     Выйти из нескольких функций #7
taras atavin, и будет такая туча ненужных проверок, что капец. Если функции друг из друга вызываются в -ндцати местах, то нужно добавить столько же if после них - не вариант. Вызывать функции друг из друга один раз не выйдет по упомянутой вами выше логике программы. Так же, как я говорил, не стоит писать о "каждая функция должна завершаться в соответствие её логике и это, мол, костыль", ибо по логике программы (да-да, щас начнут писать, что значит программа составлена неверно, раз такая логика) обязан быть именно такой выход, именно из косвенной рекурсии и, желательно (очень-очень), безовсяких дополнительных if. Это как добавить exit(nError) в функцию проверки на критические ошибки, вместо задания флага, что ошибка была и соответствующей проверки после функции обработки.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
03.01.2014, 10:58     Выйти из нескольких функций #8
Цитата Сообщение от nexen Посмотреть сообщение
taras atavin, и будет такая туча ненужных проверок, что капец.
Ни одной не нужной проверки не будет.

Добавлено через 1 минуту
Цитата Сообщение от nexen Посмотреть сообщение
Если функции друг из друга вызываются в -ндцати местах, то нужно добавить столько же if после них - не вариант.
Не важно, в скольких местах одна функция вызывает другую, return завершит её в любом месте.
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.01.2014, 11:01     Выйти из нескольких функций #9
Реализовать f2 следующим образом:
C++
1
2
3
4
5
void f2( bool flag )
{
   if( flag ) return;
   f1();
}
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
03.01.2014, 11:10     Выйти из нескольких функций #10
Не будет ни одного лишнего if. Каждый экземпляр вызывает два других в двух местах, найди костыль, лишний if и монструозность:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
bool Search(TNode *Root, int Data, TNode *Node)
{
 bool Result;
 if (Root->Data==Data)
 {
  Node=Root;
  return true;
 }
 if (Root->Left)
 {
  Result=Search(Root->Left, Data, Node);
  if (Resutl)
  {
   return true;
  }
 }
 if (Root->Right)
 {
  return Search(Root->Right, Data, Node);
 }
 return false;
}
. Всё соответствует логике функции и её подзадачи. А если решаешь что то монструозное, то не удивляйся такому же программному тексту.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
03.01.2014, 11:16  [ТС]     Выйти из нескольких функций #11
Tulosba, ой, плохой пример привел.
Немного отредактирую:
функция возвращает bool, если взяла на себя работу и false, если не может обработать некоторые данные. Выпрыгнуть из всей рекурсии надо тогда, когда данные удовлетворяют некоторому условию. Не имеет разницы, что вернут функции (и вернут ли они вообще что-то) в этом случае.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool f1()
{
/*что-то, что решает, может ли функция обработать данные и, если может, обрабатывает и возвращает true*/
return f2();
}
bool f2()
{
/*что-то, что решает, может ли функция обработать данные и, если может, обрабатывает и возвращает true*/
if (..) //ни f1, ни f2 не могут обработать данные, выпрыгиваем, иначе бесконечная рекурсия
goto HERE;
return f1();
}
int main()
{
f1();
HERE:
doSomethingElse();
}
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
03.01.2014, 11:27     Выйти из нескольких функций #12
Можно, кстати, и в макрос запихать условный return. Параметр макроса подставляется в правую часть оператора присваивания и если присвоилось true, то return. А выход из рекурсии с разворотом стека можно делать только при низкоуровневой оптимизации, пока до неё не дошёл, всякий выход из рекурсии должен быть возвратом из всех экземпляров всех функций по цепочке.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
03.01.2014, 11:49  [ТС]     Выйти из нескольких функций #13
taras atavin, исключения бы подходили идеально, но использовать их нельзя ;d
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
03.01.2014, 13:09     Выйти из нескольких функций #14
Согласен, но так делать не надо.
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.01.2014, 13:39     Выйти из нескольких функций #15
Цитата Сообщение от nexen Посмотреть сообщение
ой, плохой пример привел.
Потому что надуманный.
По коду видим чередование f1, f2. Отсюда, как мне кажется, имеет смысл реализовать вовсе без рекурсии, циклом:
C++
1
2
3
4
do
{
    f1();
} while( f2() );
Если нужно с передачей аргументов внутрь функций.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
03.01.2014, 13:47  [ТС]     Выйти из нескольких функций #16
Tulosba,
Цитата Сообщение от nexen Посмотреть сообщение
Да и так забавно, когда описываешь задачу, а тебе говорят:"изменяй условия задачи! Не используй это и это, а используй это и это" :\
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
03.01.2014, 13:53     Выйти из нескольких функций #17
Цитата Сообщение от nexen Посмотреть сообщение
Да и так забавно, когда описываешь задачу, а тебе говорят:"изменяй условия задачи! Не используй это и это, а используй это и это" :\
Не путай задачу с количеством ифов.
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.01.2014, 13:58     Выйти из нескольких функций #18
nexen, когда условие задачи состоит в том, чтобы забить шуруп отверткой, то условие задачи безусловно надо менять.
iifat
2196 / 1349 / 99
Регистрация: 05.06.2011
Сообщений: 3,715
03.01.2014, 14:04     Выйти из нескольких функций #19
Ну, в Цэ есть ещё setjump/longjump, так, кажись. По сути дела, исключения для бедных — для бедных Цэшников. Если и этого нельзя, только if — насколько помню, обычный goto разрешён только в пределах одной функции. Именно потому, что не делает возвратов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2014, 14:10     Выйти из нескольких функций
Еще ссылки по теме:

C++ Программирование задач с использованием нескольких функций
C++ Как выйти из функции
C++ Объявление нескольких функций в head.h
C++ Как выйти из оператора if
Работа с файлом из нескольких функций C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
03.01.2014, 14:10     Выйти из нескольких функций #20
Если ты корень диска что то кинул, то это ещё не значит, что и остальные поступили также. У линуксоидов, например, нет самого диска. Да и на винде очень не рекомендуется захламлять корень.
Yandex
Объявления
03.01.2014, 14:10     Выйти из нескольких функций
Ответ Создать тему
Опции темы

Текущее время: 14:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru