Имя: Пароль:
1C
 
Продолжить Прервать во ВЛОЖЕННЫХ циклах
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
Лучше всего так:

Выходить1 = 0;
Сч1 = 0;
Пока (Выходить1 = 0) И (Сч1<МаксСч1) Цикл
   Выходить2 = 0;
   Сч2 = 0;
   Пока (Выходить2 = 0) И (Сч2<МаксСч2) Цикл
       Cч2 = Сч2 + 1;
       Если СлучиласьБяка = 1 Тогда
           Выходить2 = 1;
       КонецЕсли;
   КонецЦикла;
   Сч1 = Сч1 + 1;
   Если (Выходить2=0) И (КогдаВнутриБякаВыходим=1) Тогда
       Выходить1 = 1;
   КонецЕсли;
КонецЦикла;
29 AndrewHV
 
14.07.06
04:04
Ошибочка

Выходить1 = 0;
Сч1 = 0;
Пока (Выходить1 = 0) И (Сч1<МаксСч1) Цикл
   Выходить2 = 0;
   Сч2 = 0;
   Пока (Выходить2 = 0) И (Сч2<МаксСч2) Цикл
       Cч2 = Сч2 + 1;
       Если СлучиласьБяка = 1 Тогда
           Выходить2 = 1;
       КонецЕсли;
   КонецЦикла;
   Сч1 = Сч1 + 1;
   Если (Выходить2=1) И (КогдаВнутриБякаВыходим=1) Тогда
       Выходить1 = 1;
   КонецЕсли;
КонецЦикла;
30 AndrewHV
 
14.07.06
04:11
Или можно ещё так:

Пока ВыполняетсяУсловие1 = 1 Цикл
   Пока ВыполняетсяУсловие2 = 1 Цикл
       Если СлучиласьБяка = 1 Тогда
           Если КогдаВнутриБякаИдемНаСледующийШагСнаружи = 1 Тогда
               НадоПродолжить = 1;
           КонецЕсли;
           Прервать;
       КонецЕсли;
   КонецЦикла;
   Если НадоПродолжить = 1 Тогда
       Продолжить;
   КонецЕсли;
КонецЦикла;
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 не было).