Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > глобальные метки


Автор: Curiosa 13.1.2010, 18:30
Есть ли такие, как их объявлять?

Автор: zim22 13.1.2010, 18:50
а локальные метки есть?

Автор: GoldFinch 13.1.2010, 19:06
глобальных нету - только внутри функции

используй пустую функцию как глобальную метку ;)
(с умом используй)

Автор: Curiosa 13.1.2010, 20:41
Если я использую функцию, то после "пророботки" она вернется в точку вызова, а мне нужно в main ;)

Автор: djamshud 14.1.2010, 01:43
Curiosa, после проработки кидайте особое исключение и ловите его в main. Но вообще странное желение какое-то).

Еще есть сишный longjmp:
http://www.opennet.ru/man.shtml?topic=longjmp&russian=0&category=&submit=%F0%CF%CB%C1%DA%C1%D4%D8+man
Вот только в одних источниках говорится, что он соответствует аж стандарту C89, а в других - только POSIX. Кому верить, не знаю.

Добавлено через 2 минуты и 4 секунды
Так же у longjmp под большим вопросом (в случае использования с++), нормально ли переживут такой скачок многие из объектов.

Автор: Alek86 14.1.2010, 11:34
если очень надо, для этого можно использовать исключения

но уверен, что ты просто неправильно решаешь задачу

Автор: baldina 14.1.2010, 12:00
Curiosa, глобальных меток нет и тому есть несколько причин:
1. Переход на адрес внутри другой функции не является корректным, т.к. стек отражает состояние текущей функции. в стеке адреса возвратов и локальные переменные. 
2. В языке имеется достаточно других средств управления ходом программы.
3. Желание прыгнуть за пределы функции чаще всего говорит о неправильном проектировании алгоритма и вносит в проект лишние сильные связи. Иными словами, немного подумав и изменив алгоритм, получим более простую, ясную и логичную программу.

Есть, как уже сказали, два способа изменить ход программы, передав управление в иную функцию - setjmp\longjmp и исключения.
Первое вполне справляется с установкой указателя стека, но объекты при этом не разрушаются корректным образом. Второе (исключения) аккуратно вызывает деструкторы всех локальных объектов, хранящихся в стеке.

Так что технически возможно, практически - скорее всего неправильно. Задачу в студию, подумаем, подскажем.

Автор: Curiosa 15.1.2010, 16:51
Задача: поиск в глубину. Проблема возникла из-за рекурсии. Т.е там где управление должно было переходить в main, осуществлялось углубление. Сделала так: поставила флаг на выход) Спасибо за ответыsmile

Автор: baldina 15.1.2010, 18:14
Код

// поиск в глубину на связном ациклическом (для простоты иллюстрации) графе - дереве
template <typename Tree,  typename Key>
bool depth_search (Tree* g, Key key)
{
   if (g->value == key) // проверяем текущий узел
     return true;

   for (int i=0; i < g->num_childs(); ++i) // цикл для всех поддеревьев
      if (depth_search (g->child[i], key)) // рекурсивный поиск в i-м поддереве
         return true;

  return false;
}


Что-то в этом роде. Метки не нужны.

Автор: Curiosa 15.1.2010, 23:53
Цитата(baldina @  15.1.2010,  18:14 Найти цитируемый пост)
поиск в глубину на ациклическом (для простоты иллюстрации) графе

Я именно циклы искала ;]

Автор: baldina 15.1.2010, 23:59
с циклами Вам потребуется помечать вершины - пройдена или нет.
посмотрите http://ru.wikipedia.org/wiki/Поиск_в_глубину
здесь алгоритм в общем виде, с рекурсией и без меток

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)