Имя: Пароль:
1C
 
Конструкция "Пока 1 = 1 Цикл "
0 ice123
 
05.02.10
16:12
Увидел подобную конструкцию в программном коде и задался вопросом, а для чего она используется?
Для чего организовывать подобный цикл?
1 ДенисЧ
 
05.02.10
16:13
Для того, чтобы вычислять условие прерывания унутре цикла. Вообще - это частный случай goto, который многие ненавидят лютой ненавистью...
2 ОбычныйЧеловек
 
05.02.10
16:13
(0) внутри где то есть "прервать"...найди и поймешь для чего...
3 Скользящий
 
05.02.10
16:13
цикл с условием выхода.
4 План счетов
 
05.02.10
16:13
Видимо когда нет возможности посчитать кол-во циклов
5 XLife
 
05.02.10
16:13
простой бесконечный цикл, выход задаешь внутри
6 ice123
 
05.02.10
16:17
Спасибо! всем!!! посмотрю ща....
7 Скользящий
 
05.02.10
16:17
однако. 5 ответов в течение одной минуты. Рекорд для тематической ветки.
8 zak555
 
05.02.10
16:24
если много вариантов : 2=2, 3=3, "х"<>"й" ...
9 Ненавижу 1С
 
гуру
05.02.10
16:29
потому что в 1С (который я, конечно, ненавижу) нет цикла с постусловием:
do ... while
10 NcSteel
 
05.02.10
16:34
(9) Пос условие можно эммулировать (даже нужно ) другим способом .
11 Ненавижу 1С
 
гуру
05.02.10
16:38
(10) можно, непонятно почему "даже нужно"
12 NcSteel
 
05.02.10
16:39
(11) Потому что не будет такой конструкции , которая может принести больше хлапот чем выгод.
13 truba
 
05.02.10
16:41
(12) ровно же столько сколько и конструкция
Пока Цикл
КонецЦикла;
А читаемость кода в некоторых случая растет в разы
14 nop
 
05.02.10
16:44
(10) как ?
15 NcSteel
 
05.02.10
16:53
(14) Например так :

А = 10;
Пока А<20 Цикл
А = А+1;
КонецЦикла;
16 zak555
 
05.02.10
16:54
(14)


Пока "х"<>"й" Цикл

  //...
  Если МоёУсловие=1 Тогда Прервать;
КонецЦикла;
17 фобка
 
05.02.10
16:58
(15) ну как бэ..
For i = 10 To 19 Do
EndDo;
18 truba
 
05.02.10
16:59
ага, только А=10 может из нескольких десятков строк состоять (это в хорошем случае) и с точностью до запятой повторять А=А+1; очень удобно.
19 NcSteel
 
05.02.10
17:02
(17) Ты не в теме . Это всего лишь пример абстрактный.

(18) больше 10 строк обычно занашу в функцию , конечно не считая запросы.

Так что такой пример будет выглядить так:
А = 10;
А = Функция(А);

Пока А < 20 Цикл

А = Функция(А);
КонецЦикла;
20 фобка
 
05.02.10
17:06
(19) А так?

For i = 10 To 19 Do
  i = Function(i);
EndDo;
21 filh
 
05.02.10
17:08
(20) твой код отработает 10 раз и усе...
22 filh
 
05.02.10
17:08
хотя менять переменную цикла внутри цикла...
23 NcSteel
 
05.02.10
17:11
(20) У тебя с воображением туго .
24 H A D G E H O G s
 
05.02.10
17:11
Нашли что обсудить.
25 NcSteel
 
05.02.10
17:11
(24) Не видишь я нашел гиперссылку "v7" .
26 фобка
 
05.02.10
17:12
(23) не жалуюсь ;)
27 NcSteel
 
05.02.10
17:13
(26) Имелось ввиду сама структура , а не реализация частной задачи , которая была взята только как абстрактный пример.
28 фобка
 
05.02.10
17:16
(27) понимаю, просто многие не любят оператор For To Do.. тема навеяла вот я и задумался
29 truba
 
05.02.10
17:22
(19) ну а какая разница? в чем выгода?
конструкция (16) вот оч. понятна для чтения и содержит в себе те же самые подводные камни, из цикла и там и там можно никогда не выйти. Какие еще камни возможны?
30 NcSteel
 
05.02.10
18:00
(28) Я тоже не люблю , так как нет возможности указать шаг.
31 zak555
 
05.02.10
18:16
(28) почему не любят ?
32 Ваше благородие
 
05.02.10
18:22
Бу-га-га.

(16) Зачет! :)
33 DJ Anthon
 
06.02.10
07:19
(8) лично мне больше нравится
Пока (2 * b) or not (2 * b) Цикл
34 1Сергей
 
06.02.10
07:26
(33) Семерка так не работает
35 DJ Anthon
 
06.02.10
07:36
(34) уахххахахахахаааааа!
36 DJ Anthon
 
06.02.10
07:39
(34) это я над собой ))))
37 1Сергей
 
06.02.10
07:44
а... типа по Уильяму нашему Шекспиру? :))))))
сразу не догнал
38 DJ Anthon
 
06.02.10
07:47
(37) ага, но это действительно из восьмерки, я в сабже поздно разглядел. кроме того, еще в глобальнике надо прописать переменную b, чтоб работало, а так - все изящнее, чем х <> у...
(16) а 1 = 1 быстрее набирается, если что... и понятнее, кста
39 Дядя Васька
 
06.02.10
07:52
"х"<>"й" это зачетно )
40 DJ Anthon
 
06.02.10
07:59
Ну ладно-ладно, уговорили. Все равно у меня в конфиге матерных слов больше, чем скомпилированных...
41 dk
 
06.02.10
08:02
хз, меня такие циклы бесят
---
ведь можно же заменить на
Пока МояПеременная <> УсловиеВыхода
ну и в цикле задавать условиевыхода, хотя разницы конечно немного, но читать проще код
42 DJ Anthon
 
06.02.10
08:17
мда... а если условий выхода несколько? СписокЗначений? чем тебя Прервать не устраивает? бесят... вот меня бесят ошибки в конфигах, ну никак не варианты задания циклов! между прочим, это оттого, что нет в 1ске аналога repeat until!
43 VladZ
 
06.02.10
08:18
(0) Такая конструкция используется, когда условий выхода из цикла много.
44 dk
 
06.02.10
08:24
(42) да хоть сто
Если ялялял Тогда
 УсловиеВыхода = 1
Если люлюлю тогда
 УсловиеВыхода = 1
----
прервать тока для дополнительного выхода, основной цикл должен правильно работать
---
впрочем это я так, ворчу немного, в принципе мой вариант от (0) почти не отличается, только читать удобнее
45 1Сергей
 
06.02.10
08:42
(44) Я тоже обычно флаг использую
46 VladZ
 
06.02.10
08:54
(44) Когда код простой, можно и так. А вот когда у тебя в цикле обработка "космических утюгов" - удобнее через (0).
47 NcSteel
 
06.02.10
09:07
(46) Любой сложный код можно обернуть функцией и вернуть флаг выхода.
48 НикДляЗапросов
 
06.02.10
09:15
Пока "Все дома" = "Все дома" Цикл
 Если Мама.УшлаПоМагазинам = Истина Тогда
   Прервать;
 КонецЕсли;
КонецЦикла;
49 ДенисЧ
 
06.02.10
09:20
Кстати, не забываем ещё про volatile-переменные, которые могут меняться по событиям...

Хотя в 1с они вряд дли поменяются в таком цикле...
50 zak555
 
06.02.10
11:33
(49) переведи! :-)
51 ДенисЧ
 
06.02.10
11:34
(50) Какое слово тебе непонятно?
Начни отсюда http://en.wikipedia.org/wiki/Volatile
52 zak555
 
06.02.10
11:35
(51) там тоже нужен перевод )))
53 ДенисЧ
 
06.02.10
11:38
(52) volatile-переменные - это те, которые могут изменить своё значение в произвольный момент, вне зависимости от логики кода. Например, в обработчике прерывания. Или константы в 1с...
54 ALoHA
 
06.02.10
11:48
Безусловный цикл. Один будет всегда равно один).
55 Песец
 
06.02.10
11:49
Процедура ОчистЗап()
  ДБФ.Первая();
  Пока 1 = 1 Цикл
     ДБФ.Очистить();
     ДБФ.Записать();
     Если ДБФ.Следующая() = 0 Тогда
        Возврат;
     КонецЕсли;
  КонецЦикла;
КонецПроцедуры

(с) ЖКК
56 1Сергей
 
06.02.10
11:49
(54) Спасибо, Кэп
57 zak555
 
06.02.10
11:50
(55) см. поиск файлов по расширению!
например *.ert|*.efd
58 Cthulhu
 
06.02.10
12:04
(52):
Изменчивый означает изменяться или изменчивый. Его форма существительного - изменчивость, которая обращается к любой из нескольких мер неустойчивости. Это может обратиться к:
По химии:

Изменчивость (химия), мера тенденции вещества, чтобы испариться. Это было также определено как мера того, как с готовностью вещество испаряется.
Относительная изменчивость, мера давлений пара компонентов в жидкой смеси
Volatiles, группа составов с низкими точками кипения, которые связаны с коркой планеты или луны и/или атмосферой
Изменчивые органические составы, органические составы, которые могут испариться в нормальной температуре и давлении, и часто регулируются правительствами
Изменчивая анастезиология, класс анастезиологии, которые испаряются легко
Изменчивая токсикомания, злоупотребление домашними ингаляторами, содержащими изменчивые составы
Изменчивая нефть, также известная как существенная нефть, нефть произошла из заводов с соединениями ароматического ряда, используемыми в косметике и приправе
Изменчивая кислотность, срок, используемый в winemaking, чтобы указать недопустимым образом высокий уровень кислоты или уксуса и пищевой соды.
59 Cthulhu
 
06.02.10
12:06
(58)+:
В информатике:

Изменчивые переменные, переменные, которые могут быть изменены внешним процессом
Изменчивая память, память, которая длится только, в то время как власть идет (и таким образом был бы

потерянный после переначала) В астрологии

Изменчивый кусок замороженного gasses найденный главным образом в поясе Kuiper.

В экономике:

Изменчивость (финансы), мера риска в финансовом инструменте

В геологии:

Volatiles, изменчивые составы магмы (главным образом водный пар), которые затрагивают появление и силу вулканов

В математической теории вероятности:

Стохастическая изменчивость

В политике:

Индекс Pedersen, мера избирательной изменчивости в политических партийных системах

Другие использования:

Изменчивые Игры, изготовитель видеоигр
60 Torquader
 
06.02.10
13:01
В принципе, вместо бесконечного цикла можно использовать метки, но тогда их будет две - одна в начале цикла, а другая в конце, но все прекрасно понимают, что метки не позволяют сразу постичь логику программы (особенно, когда у вас цикл на несколько страниц кода), но с метками можно выходить из вложенных циклов без проверки всяких доп-условий.
А по скорости исполнения быстрее всего выполняется сравнение с нулём, поэтому в условии лучше всего писать 0=0.

Процедура Выполнить()
   var p;var i;
   // вариант через goto - самое "нехорошее"
   p=_GetPerformanceCounter();
   i=0;
   ~BeginLabel:
       if i>1000000 then goto ~EndLabel;endif;
       i=i+1;
       goto ~BeginLabel;
   ~EndLabel:
   Message("1:"+String(_GetPerformanceCounter()-p));
   // вариант через цикл с нулём
   p=_GetPerformanceCounter();
   i=0;
   while 0=0 do
       if i>1000000 then break;endif;
       i=i+1;
   enddo;
   Message("2:"+String(_GetPerformanceCounter()-p));
   // вариант с единицей
   p=_GetPerformanceCounter();
   i=0;
   while 1=1 do
       if i>1000000 then break;endif;
       i=i+1;
   enddo;
   Message("3:"+String(_GetPerformanceCounter()-p));
   // вариант со сттрокой
   p=_GetPerformanceCounter();
   i=0;
   while "a"<>"b" do
       if i>1000000 then break;endif;
       i=i+1;
   enddo;
   Message("4:"+String(_GetPerformanceCounter()-p));
КонецПроцедуры

Результат выполнения:
1:842
2:1080
3:1080
4:1089
P.S. метки оказались достаточно быстрыми, а в остальных случаях никакой разницы нет.
61 1Сергей
 
06.02.10
13:16
(60) попробовал вариант с флагом - самый медленный
62 DJ Anthon
 
07.02.10
14:13
(44) "прервать тока для дополнительного выхода, основной цикл должен правильно работать"  а что выходы из цикла могут быть дополнительными или основными? лишнее усложнение теории и, соответственно, кода. выйти - так выйти. лучше бы кодеры беспокоились о граничных условиях и о пользователях/следующих программеров этого же гребаного кода....
63 Дядя Васька
 
07.02.10
14:15
(62) Да так уж и пиши, "Прервать" это для лохов...
64 Torquader
 
07.02.10
14:19
Прервать, это узаконенный goto, который переводит точку исполнения за пределы цикла. В отличие от goto нет возможности прерывания вложенных циклов.
65 DJ Anthon
 
07.02.10
14:23
(64) тут про вложенные циклы пока никто не говорил. это совсем другой коленкор!
(63) сам ты лох
66 Cthulhu
 
07.02.10
14:30
(64): есть возможность - проверка граничного/проверяемого значения цикла сразу после цикла: если условие цикла выполнено (или граничное значение не превышено счетчиком) - значит выход выполнен прерыванием.
67 DJ Anthon
 
07.02.10
14:33
(66) угу, вариантов логики может быть море. главное, что механизму 1 = 1 - жить. а им лишь бы пообзываться.
68 Киборг
 
07.02.10
15:40
Конструкцией "Пока Истина Цикл" (так лучше) не надо злоупотреблять. Каждый случай использования должен быть исключительным. :)
69 Cthulhu
 
07.02.10
17:04
(68): категоричность кажется малоуместной, извини.
особено при том, что сама необходимость применения подобных вещей - сама по себе достаточно исключительна.
70 Киборг
 
08.02.10
10:02
(69) то есть даже если это самый лучший из МНОГИХ вариантов и по МНОЖЕСТВУ факторов, то ты его все равно избегаешь?
71 orefkov
 
08.02.10
10:28
Имхо.
1. Применять можно, когда условие выхода должно быть в середине цикла.
2. Когда условие выхода должно быть в середине цикла, нужно применять Пока 1=1 Цикл, ибо это сразу дает понять, что условие выхода в середине цикла.

Пример:

Функция Из10в16(Знач Ч)
   с16 = "0123456789ABCDEF";
   рез = "";
   Пока 1 = 1 Цикл
       рез = Сред(с16, 1 + (Ч % 16), 1) + рез;
       Ч = Цел(Ч / 16);
       Если Ч = 0 Тогда
           Прервать;
       КонецЕсли;
   КонецЦикла;
   Возврат рез;
КонецФункции    // Из16В10

Если избавляться от "1 = 1", тогда нужно писать так:

Функция Из10в16(Знач Ч)
   Если Ч = 0 Тогда
       Возврат "0";
   КонецЕсли;
   с16 = "0123456789ABCDEF";
   рез = "";
   Пока Ч <> 0 Цикл
       рез = Сред(с16, 1 + (Ч % 16), 1) + рез;
       Ч = Цел(Ч / 16);
   КонецЦикла;
   Возврат рез;
КонецФункции    // Из16В10
72 Киборг
 
08.02.10
11:51
Не могу припомнить ни одного учебника по программированию, в котором бы описывались правила применения как бесконечного цикла, так и операторов перехода?! Тем не менее разработчики языков программирования упорно вставляют в них возможность использования этих конструкций разаработчиками программ. Почему? (Сказку про Синюю бороду не напоминает? Нафига было ей ключ давать?)

(71) Конструкция
Пока Истина Цикл
тянет на исключительную, а конструкция
Пока 1=1 Цикл
ну никак, как минимум, на одну из многих, типа
Пока абракадабра=абракадабра Цикл
:))
73 truba
 
08.02.10
12:01
Итого:
Все представленные здесь конструкции:

УсловиеВыхода = 0;
Пока УсловиеВыхода = 0 Цикл
 УсловиеВыхода = ПолучитьУсловиеВыхода();
КонецЦикла;

Требуют инициализации Переменной УсловиеВыхода, которая, обычно, сложна.
Все любители "правильный циклов" рано или поздно "оформляют это в отдельную функцию" либо разбив копья о мельницы в своих мозгах приходят к вообще то известную еще со времен паскаля и ранее конструкцию цикла с пост-условием. которая в 1с имеет вид Пока 1=1 Цикл.
74 orefkov
 
08.02.10
12:02
(72) Ну нет в семерке Истина
А вот в С++ сплошь и рядом
while(true)
или
for(;;)
75 Киборг
 
08.02.10
12:10
(74) эээ... нуууу... тогда, да :)
76 Табуретко
 
08.02.10
14:03
и както все разом забыли в подобных циклах про некий счетчик, так на всякий пожарный, чтоб цикл не оказался вечным...
77 Fragster
 
гуру
08.02.10
14:04
а я пишу пока функция() цикл конеццикла;
78 Fragster
 
гуру
08.02.10
14:04
иногда
Независимо от того, куда вы едете — это в гору и против ветра!