![]() |
![]() |
![]() |
|
Продолжить Прервать во ВЛОЖЕННЫХ циклах | ☑ | ||
---|---|---|---|---|
0
ildus
13.07.06
✎
18:26
|
относятся к внутреннему циклу или нет?
|
|||
1
mrkorn
13.07.06
✎
18:27
|
(0) это, пожалуй, единственный случай, когда нужно использовать GOTO
|
|||
2
Ёпрст2
13.07.06
✎
18:27
|
(0)Эт смотря в каком месте писать ...
|
|||
3
ildus
13.07.06
✎
18:28
|
(2)если продолжить или прервать написано во внутреннем цикле
|
|||
4
Широкий
13.07.06
✎
18:28
|
продолжить и прервать относиться только к циклу в котором был вызван
|
|||
5
ildus
13.07.06
✎
18:28
|
(1) это будет плохой стиль
|
|||
6
mrkorn
13.07.06
✎
18:29
|
(5) я же написал, что это единственный случай, когда можно
|
|||
7
Deon
13.07.06
✎
18:31
|
(6) но не нужно
|
|||
8
Широкий
13.07.06
✎
18:32
|
В функцию вынеси цикл - если что - возврат
Насчет продолжить - тут уж придется изгаляться с временными переменными |
|||
9
Скользящий
13.07.06
✎
18:32
|
(0) Насколько я знаю, если такой вопрос возникает, то нужно переписывать весь код. :-) Иначе пишешь и думаешь - твой код - отстой! :-)
|
|||
10
Deon
13.07.06
✎
18:37
|
(9) А реализуй поиск в 2-мерном массиве с выходом при нахождении нужного значения
|
|||
11
mrkorn
13.07.06
✎
18:37
|
ах да, в (6) это я про прервать...
про продолжить либо переменные, либо условия |
|||
12
ildus
13.07.06
✎
18:45
|
(4) это хорошо что только к внутреннему. Определенность лучше неопределенности.
|
|||
13
mrkorn
13.07.06
✎
18:46
|
(5) Пословица: Кто ясно мыслит, ясно излагает.
|
|||
14
mrkorn
13.07.06
✎
18:46
|
(13) это к (12)
|
|||
15
Ёпрст2
13.07.06
✎
18:55
|
(10) Функция + Возврат...
|
|||
16
Deon
13.07.06
✎
18:56
|
(15) Но вопрос-то возник, как это реализовать ;)
|
|||
17
Ёпрст2
13.07.06
✎
19:00
|
(16) см.8,15
|
|||
18
romix
модератор
13.07.06
✎
20:06
|
Имхо единственный правильный путь в данной ситуации - это конечно не goto, а использовать ИСКЛЮЧЕНИЯ.
__try { // защищенный блок } __except (фильтр исключений) { // обработчик исключений } http://rosigma.com/97.aspx ЧАСТЬ V. СТРУКТУРНАЯ ОБРАБОТКА ИСКЛЮЧЕНИЙ ГЛАВА 23. Обработчики завершения Закроем глаза и помечтаем, какие бы программы мы писали, если бы сбои в них были невозможны! Представляете, памяти навалом, неверных указателей никто не переда ет, нужные файлы всегда на месте Не программирование, а праздник, да? А код про грамм? Насколько он стал бы проще и понятнее! Без всех этих if и goto, И если Вы давно мечтали о такой среде программирования, Вы сразу жс оцените структурную обработку исключений (structured exception handling, SEH). Преимуще ство SEH в том, что при написании кода можно сосредоточиться на решении своей задачи Если при выполнении программы возникнут неприятности, система сама обнаружит их и сообщит Вам. Хотя полностью игнорировать ошибки в программе при использовании SEH нельзя, она всс жс позволяет отделить основную работу от рутинной обработки оши бок, к которой можно вернуться позже. Главное, почему Microsoft ввела в Windows поддержку SEH, было ее стремление упростить разработку операционной системы и повысить ее надежность. А нам SЕН поможет сделать надежнее наши программы |
|||
19
romix
модератор
13.07.06
✎
20:08
|
В 7.7, к сожалению, нельзя "просто так" вызвать исключение - и требуется использовать внешние компоненты наподобие 1С++.
Я написал ВК попроще: http://x-romix.narod.ru/Events.rar |
|||
20
romix
модератор
13.07.06
✎
20:10
|
Иногда я делаю так:
Сообщить("Текст ошибки"); а=1/0; чтобы вызвать исключение (чтобы обработка "отвалилась" по ошибке). |
|||
21
sssssergey
13.07.06
✎
20:32
|
А если нужно прервать сразу два или более циклов? Мне кажется в (1) прав в этом случае. Хотя где то читал что математически доказанно, что в любой ситуации можно обойтись без goto.
А как можно обойтись в этой ситуации когда нужно прервать сразу два цикла когда срабатывает условие? for i:=1 to 4 do for j:=1 to 4 do if mov[i,j]=(Sender as TComponent).Tag then goto 1; 1: mov[i+y1,j+x1]:=mov[i,j]; |
|||
22
romix
модератор
13.07.06
✎
20:55
|
(21) Исключение позволяет выйти сразу из неограниченного числа циклов и вложенных процедур, чем и хорошо.
|
|||
23
sssssergey
13.07.06
✎
21:04
|
(22) Возможно, но в случае (21), что бы вызвать исключение кода было бы больше, проще написать goto .
|
|||
24
mrkorn
13.07.06
✎
21:27
|
||||
25
Ангел- Хоронитель
13.07.06
✎
21:56
|
(6)гон полный, этот случай лишний раз подтверждает, что можно обойтись без GoTo. Элементарная проверка на завершенность цикла поможет в этом.
|
|||
26
Ангел- Хоронитель
13.07.06
✎
22:02
|
+(25)еще можно все циклы в функцию и использовать Возврат, но это слишком просто...
|
|||
27
smaharbA
13.07.06
✎
23:43
|
Ангел, извини но на машинных кодах нет проверок, но есть Джамп... И почемуто все еще так, уже не первое десятилегте...:)
|
|||
28
AndrewHV
14.07.06
✎
04:03
|
Лучше всего так:
|
|||
29
AndrewHV
14.07.06
✎
04:04
|
Ошибочка
|
|||
30
AndrewHV
14.07.06
✎
04:11
|
Или можно ещё так:
|
|||
31
Ангел- Хоронитель
14.07.06
✎
09:47
|
(27)на машинных кодах - это ладно, никто не спорит, так быстрее. но код, написанный одним программистом, придется отлаживать другому да и ему самому... тут же речь идет об этике и элементарной вежливости.
|
|||
32
selenat
14.07.06
✎
09:53
|
Тоже очень не нравится гото, но в случае нескольких вложенных ИМХО все-таки оправдано (проще чем логические переменные юзать и работать все-таки безошибочно будет, несмотря на некрасивость такого подхода).
|
|||
33
ATI
14.07.06
✎
09:53
|
как кулхацкеры спорят про goto: просто войны какие-то :))
http://www.rsdn.ru/forum/message.asp?mid=57977&only |
|||
34
АЛьФ
14.07.06
✎
09:54
|
2(19) А СП читать не пробовал? :)
ВызватьИсключение; Raise; Синтаксис: ВызватьИсключение; Назначение: Данный оператор применяется в языковой конструкции Попытка-Исключение-КонецПопытки. Обработки исключительной ситуации могут быть вложенными. При этом, при возникновении исключительной ситуации управлениие будет передано на самый ''внутренний'' обработчик, начинающийся с ключевого слова Исключение. Последовательность операторов обработки исключительной ситуации может содержать оператор ВызватьИсключение. Выполнение данного оператора прекращает выполнение последовательности обработки исключительной ситуации и производится поиск более ''внешнего'' обработчика. Если таковой есть, то управление передается на его первый оператор. Если нет, то выполнение модуля прекращается с выдачей сообщения о первоначально возникшей ошибке. Оператор ВызватьИсключение может встречаться только внутри операторных скобок Исключение ... КонецПопытки. Параметры: Нет. |
|||
35
selenat
14.07.06
✎
09:56
|
(34) А если все это идет в транзакции, то такая метода не хляет - потом зафиксировать не удастся...
|
|||
36
Ангел- Хоронитель
14.07.06
✎
10:04
|
(32)безошибочно - хорошо, но всего одна строка в коде, если ты вдруг забыл про вставленный goto, может привести к ошибке. и отладить эту ошибку можно будет только перерыв весь код.
|
|||
37
selenat
14.07.06
✎
10:06
|
(36) То есть? Не врубился. Кстати, я кажется разобрался - в чем там дело было в моем запросе...
|
|||
38
Ангел- Хоронитель
14.07.06
✎
10:12
|
(37)для примера: есть у тебя goto, который вызывается при определенных условиях, которые выполняются в любых случаях. причем между предпосылкой к условию и goto, скажем, десяток страниц. потом тебе надо поменять код, ты забываешь о goto и вставляешь строку, изменяющую предпосылки. код начинает работать неправильно. и чтобы тебе разобраться ты должен перерыть этот десяток страниц. а если это все проделывает другой человек?
|
|||
39
Ангел- Хоронитель
14.07.06
✎
10:14
|
+(38)а если страниц не десяток, а тысячи? минимум, что можно сделать, написать комментарий об использовании goto в коде, максимум - отказаться от goto.
|
|||
40
selenat
14.07.06
✎
10:24
|
(38) Не понимаю разницы - то, что условия перестанут выполняться - никак не связано с тем - как осуществляется выход - по гото или при помощи логических переменных, исследовать придется одинаково...
|
|||
41
mrkorn
14.07.06
✎
10:27
|
кстати в (24) приводя примеры, объясняют, что если есть желание програмить без GOTO нужно менять логику алгоритма, а не просто тупо избовляться от него, поэтому временные переменные, вместо GOTO - есть зло, и зло большее, чем GOTO, поэтому (29)и (30) нехиляет...
|
|||
42
romix
модератор
14.07.06
✎
10:27
|
(34) В 8.0 это работает везде, а в 7.7 действует ограничение
"Оператор ВызватьИсключение может встречаться только внутри операторных скобок Исключение ... КонецПопытки". Первое время в сп 8.0 было написано про такое же ограничение, но оно фактически не выполнялось (т.е. ограничения на Raise не было). |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |