| 1 2 3 4 5 6 7 8 9 10 11 … 20 |
| Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | LeonGorbachev | |
| Дата: | 27.05.02 10:21 | |
| Оценка: | 18 (1) ![]() | |
Как это сделать? |
| Re: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Mish | |
| Дата: | 27.05.02 10:26 | |
| Оценка: | +3 -1 | |
| Здравствуйте LeonGorbachev, Вы писали: LG>
LG>Как это сделать? Использовать goto. Ничего страшного не будет при умеренном использовании goto. Удачи. |
| Re: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | OlegO | http://www.mediachase.ru |
| Дата: | 27.05.02 10:31 | |
| Оценка: | -1 ![]() | |
| Здравствуйте LeonGorbachev, Вы писали: LG>
LG>Как это сделать? Например сгенерить исключение:
С уважением, OlegO. | |
| Re[2]: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Mishka<T> rsdn | |
| Дата: | 27.05.02 10:38 | |
| Оценка: | -2 | |
| Здравствуйте OlegO, Вы писали: OO>
Не надо так делать. Если такой код будет находиться в деструкторе, то при раскрутке стека в строке throw 77; программа будет заверешена и никакой catch (int e) не поможет. |
| Re[3]: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | LeonGorbachev | |
| Дата: | 27.05.02 10:39 |
| Здравствуйте Mishka<T>, Вы писали: MT>Не надо так делать. Если такой код будет находиться в деструкторе, то при раскрутке стека в строке throw 77; программа будет заверешена и никакой catch (int e) не поможет. я вот как раз и не хочу через исключения. И не хочу гоу-ту. Чего делать? |
| Re[4]: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Mishka<T> rsdn | |
| Дата: | 27.05.02 10:42 |
| Здравствуйте LeonGorbachev, Вы писали: LG>я вот как раз и не хочу через исключения. И не хочу гоу-ту. LG>Чего делать? Можно так:
|
| Re[5]: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Андрей rsdn | |
| Дата: | 27.05.02 10:53 | |
| Оценка: | 14 (2) | |
| Здравствуйте Mishka<T>, Вы писали: MT>Здравствуйте LeonGorbachev, Вы писали: LG>>я вот как раз и не хочу через исключения. И не хочу гоу-ту. LG>>Чего делать? MT>Можно так: MT>
Это прокатит только на VC6 Я обычно делаю так:
Возможны варианты, в зависимости от контекста |
| Re[3]: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | DarkGray | http://blog.metatech.ru/post/ogni-razrabotki.aspx |
| Дата: | 27.05.02 10:56 | |
| Оценка: | +1 -1 ![]() | |
| Здравствуйте Mishka<T>, Вы писали: MT>Не надо так делать. Если такой код будет находиться в деструкторе, то при раскрутке стека в строке throw 77; программа будет заверешена и никакой catch (int e) не поможет. Не пугай так народ, от и так уже запуганный. terminate вызывается, только если второй exception не был перехвачен внутри деструктора, чего не наблюдается в данном примере. Так что выход из вложенного цикла через исключение — нормальная ситуация. |
| Re[4]: return | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Vi2 | http://www.adem.ru |
| Дата: | 27.05.02 10:57 | |
| Оценка: | 1 (1) +1 -1 | |
| Здравствуйте LeonGorbachev, Вы писали: LG>я вот как раз и не хочу через исключения. И не хочу гоу-ту. LG>Чего делать? Если есть возможность ВЫНЕСТИ эти циклы (не очень много переменных и т.д.), можно сделать функцию и сделать возврат
Vita | Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ |
| Re[3]: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Рек rsdn | |
| Дата: | 27.05.02 10:57 |
| Здравствуйте Mishka<T>, Вы писали: MT>Здравствуйте OlegO, Вы писали: OO>>
MT>Не надо так делать. Если такой код будет находиться в деструкторе, то при раскрутке стека в строке throw 77; программа будет заверешена и никакой catch (int e) не поможет. То что не надо так делать — это ты прав. А на счет того, что программа будет завершена — не совсем. Исключение ведь перехватывется, и из деструктора не выпускаться не будет, потому всё будет работать. А делать так не надо, потому что исключение это дорогое средство и должны происходить редко (так в книжках пишут), слно алгоритмы с их помощью реализовывать не нужно, только обработку ошибок. По мне так вариант с goto наиболее понятен, слно предпочтителен. Если с души воротит от goto, то можно оформить внутренний цикл как функцию и делать из неё return вместо goto. |
| Re[6]: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | LeonGorbachev | |
| Дата: | 27.05.02 11:00 | |
| Оценка: | 2 (1) | |
| А>Я обычно делаю так: А>
Я в общем то так и делаю, только подумалось, что можно по-другому... |
| Re[4]: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | slonnik | |
| Дата: | 27.05.02 11:19 |
| Здравствуйте DarkGray, Вы писали: DG>Здравствуйте Mishka<T>, Вы писали: MT>>Не надо так делать. Если такой код будет находиться в деструкторе, то при раскрутке стека в строке throw 77; программа будет заверешена и никакой catch (int e) не поможет. DG>Не пугай так народ, от и так уже запуганный. DG>terminate вызывается, только если второй exception не был перехвачен внутри деструктора, чего не наблюдается в данном примере. DG>Так что выход из вложенного цикла через исключение — нормальная ситуация. А если не cекрет а почему именно ВТОРОЙ exception и в чем его отличие от первого |
| Re[6]: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Kaa rsdn | http://blog.meta.ua/users/kaa/ |
| Дата: | 27.05.02 11:51 |
| Здравствуйте Андрей, Вы писали: MT>>
А>Это прокатит только на VC6 Что именно? Scoping? Тогда да. А выход прокатит везде. 2 Mishka<T> Только это неправильное условие. Надо выйти из циклов при i == 77, а if — совсем другое условие дает (расширяет диапазон значений немеряно). Алексей Кирдин | |
| Re[7]: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | LeonGorbachev | |
| Дата: | 27.05.02 12:01 |
| Здравствуйте Kaa, Вы писали: Kaa>Здравствуйте Андрей, Вы писали: А>>Это прокатит только на VC6 Kaa>Что именно? Scoping? Тогда да. А выход прокатит везде. Что такое Scoping? |
| Re[4]: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Kaa rsdn | http://blog.meta.ua/users/kaa/ |
| Дата: | 27.05.02 12:04 | |
| Оценка: | ![]() | |
| Здравствуйте Рек, Вы писали: Рек>А делать так не надо, потому что исключение это дорогое средство и должны Рек>происходить редко (так в книжках пишут), слно алгоритмы с их помощью реализовывать не нужно, Рек>только обработку ошибок. Есть еще способ с использованием __leave у Microsoft, и им некоторые писатели книжек пользуются, но тогда SEH надо привлекать, что часто невозможно/трудно. Рек>Если с души воротит от goto, то можно оформить внутренний цикл как функцию Рек>и делать из неё return вместо goto. Стоит добавить, что для встроенной функции никакого оверхеда не будет (если она компилятору понравится, конечно), а способ самый красивый. Но с добавочной переменной типа bool — еще красивее. Не так наглядна декомпозиция алгоритма, но зато потерь в производительности не будет. Алексей Кирдин | |
| Re[8]: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Kaa rsdn | http://blog.meta.ua/users/kaa/ |
| Дата: | 27.05.02 12:07 | |
| Оценка: | 15 (1) +1 | |
| Здравствуйте LeonGorbachev, Вы писали: LG>Здравствуйте Kaa, Вы писали: Kaa>>Здравствуйте Андрей, Вы писали: А>>>Это прокатит только на VC6 Kaa>>Что именно? Scoping? Тогда да. А выход прокатит везде. LG>Что такое Scoping? Я имел ввиду, что область видимости переменной, объявленной в заголовке цикла, ограничена самим циклом (так написано в стандарте). В VC6 же это не так. Областью видимости переменных, там объявленых, является объемлющая для цикла область видимости. Алексей Кирдин | |
| Re: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | VladD2 rsdn | www.k-press.ru/cs |
| Дата: | 27.05.02 12:57 | |
| Оценка: | 6 (1) -1 | |
| Re[5]: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | DarkGray | http://blog.metatech.ru/post/ogni-razrabotki.aspx |
| Дата: | 27.05.02 13:33 | |
| Оценка: | 11 (4) | |
| Здравствуйте slonnik, Вы писали: S>А если не cекрет а почему именно ВТОРОЙ exception и в чем его отличие от первого Потому что третьего уже не будет При возникновении второго не обработанного исключения у компилятора возникает дилема, какое из исключений тянуть "на верх". Рассмотрим, пример:
Так вот, если при размотке стека при обработке исключения Exception1, окажется, что сгенерировалось еще одно исключение Exception2, которое ловится "выше", чем генериется первое, то у компилятора возникает дилема, какое исключение из этих двух передать в catch. В C++ пошли наиболее простым путем, и грохают всю программу(что очень сильно мешает написанию устойчивых программ), в остальных языках(Java, C#) второе исключение просто игнорируется. Рассматривать программу, как дерево, и проведем линии от возникновений исключений до их обработки. Если линии сливаются, то в этом случае программа будет завершена. |
| Re[6]: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | KA | |
| Дата: | 27.05.02 16:30 |
| Здравствуйте DarkGray, Вы писали: [skipped] DG>Так вот, если при размотке стека при обработке исключения Exception1, окажется, что сгенерировалось еще одно исключение Exception2, которое ловится "выше", чем генериется первое, то у компилятора возникает дилема, какое исключение из этих двух передать в catch. В C++ пошли наиболее простым путем, и грохают всю программу(что очень сильно мешает написанию устойчивых программ), в остальных языках(Java, C#) второе исключение просто игнорируется. По указанному простому пути идут программы, которые в деструкторах выбрасывают исключения
// | #import <windows.bas> class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; }; |
| Re[7]: Выйти из двух циклов сразу | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | DarkGray | http://blog.metatech.ru/post/ogni-razrabotki.aspx |
| Дата: | 27.05.02 17:28 |
| Здравствуйте KA, Вы писали: KA>По указанному простому пути идут программы, которые в деструкторах выбрасывают исключения KA>
Так обычно выброс исключения происходит не прямо в деструкторе, а в функции, которая вызывается из деструктора. Сама функция может и не предполагать, что ее будут вызывать из деструктора. В С++ нельзя, например, защититься от обращения по нулевому указателю внутри деструктора, что очень мешает жить программе — 24x7x365. Предлагаешь завернуть каждый деструктор в такой код. ИМХО, это уже издевательство над программистом, лучше было бы предложить выбрать, какую модель я хочу.
|
| 1 2 3 4 5 6 7 8 9 10 11 … 20 |