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

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

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

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

03.01.2014, 10:03. Просмотров 1421. Ответов 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 = быдло код"..

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

Работа с файлом из нескольких функций - C++
Здравствуйте. Нужно печатать в 1 файл из нескольких функций. Предположим есть функция main void main() { ofstream...

Объявление нескольких функций в head.h - C++
Помогите разобраться. Ниже приведенный код работает у меня. Но меня мучают сомнения, что помещать несколько функций в заголовочный файл...

Возвращение из функций нескольких значений - C++
Доброго времени суток. Нужна помощь. Дано задание: Напишите функцию swap(int& a, int& b, int& c), которая изменяет значения параметров по...

Программирование задач с использованием нескольких функций - C++
всем доброго времени суток! вроде код правильный, помогите найти ошибку!! #include <iostream.h> #include <math.h> double...

Решение задачи с применением нескольких функций - C++
Помогите с решением :) Написать программу решением задачи с помощью нескольких функций. Значения элементов динамического массива...

Функция, в функции main() или общие переменные для нескольких функций - C++
Делаю мелкую игрушку, в консоли, ради забавы и столкнулся с 1 проблемой: Невозможно, создавать функцию в функции, вынеся эту функцию за...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
03.01.2014, 10:05 #2
Исключение можно кинуть)
Но я даже не знаю что тут большее зло: логика на исключениях или goto.

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от nexen Посмотреть сообщение
Если функции друг из друга вызываются в -ндцати местах, то нужно добавить столько же if после них - не вариант.
Не важно, в скольких местах одна функция вызывает другую, return завершит её в любом месте.
1
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
03.01.2014, 11:01 #9
Реализовать f2 следующим образом:
C++
1
2
3
4
5
void f2( bool flag )
{
   if( flag ) return;
   f1();
}
1
taras atavin
Ушёл с форума.
3569 / 1753 / 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;
}
. Всё соответствует логике функции и её подзадачи. А если решаешь что то монструозное, то не удивляйся такому же программному тексту.
1
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();
}
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
03.01.2014, 11:27 #12
Можно, кстати, и в макрос запихать условный return. Параметр макроса подставляется в правую часть оператора присваивания и если присвоилось true, то return. А выход из рекурсии с разворотом стека можно делать только при низкоуровневой оптимизации, пока до неё не дошёл, всякий выход из рекурсии должен быть возвратом из всех экземпляров всех функций по цепочке.
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
03.01.2014, 11:49  [ТС] #13
taras atavin, исключения бы подходили идеально, но использовать их нельзя ;d
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
03.01.2014, 13:09 #14
Согласен, но так делать не надо.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
03.01.2014, 13:39 #15
Цитата Сообщение от nexen Посмотреть сообщение
ой, плохой пример привел.
Потому что надуманный.
По коду видим чередование f1, f2. Отсюда, как мне кажется, имеет смысл реализовать вовсе без рекурсии, циклом:
C++
1
2
3
4
do
{
    f1();
} while( f2() );
Если нужно с передачей аргументов внутрь функций.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2014, 13:39
Привет! Вот еще темы с ответами:

Подключение с помощью директивы #include нескольких функций, находящихся в разных файлах. - C++
Здравствуйте, уважаемые программисты. Помогите, пожалуйста, разобраться в такой ситуации: есть несколько функций, каждая из которых...

Написать набор функций, обслуживающих блочно-диагональные матрицы из нескольких нижне-треугольных блоков - C++
Написать набор функций (create,access,destroy), обслуживающих блочно-диагональные матрицы из нескольких нижне-треугольных блоков порядка...

Выйти из goto. - C++
Работаю в С++. Было задание написать программу с использованием goto. Вот код: ...

Как выйти из программы - C++
Написав щось подібне калькулятору. Але що написати щоб вийти з консолі?? буду вдячний. І ще наприклад для повернення в голову...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.01.2014, 13:39
Ответ Создать тему
Опции темы

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