Имя: Пароль:
1C
 
Пока Истина Цикл
,
0 prtx
 
25.09.18
17:39
Собственно вопрос в конструкции кот. указана в заголовке.

Из ветки v8: О применении "Пока Истина Цикл", я понял что это можно использовать, в случаях когда у нас много всяких-разных условий и в зависимости от условия, мы выполняем какой-то код и "выскакиваем" из цикла. Это типа аналог меток, с тех времен когда их не было?

И вот нашел кусок кода в одной конфе и вообще лыжи не едут, на кой фиг эта конструкция там используется.
вот:
Пока Истина Цикл
                
Выводить = Ложь;
ЭтоОбщий = Ложь;
                
// тут мы занимаевся всякой фиговиной и в зависимости от условий присваиваем Выводить = Истина;

Если Выводить Тогда
  ТабДокумент.Вывести(ОбластьМакета);
Иначе
  Прервать;            
КонецЕсли;
            
КонецЦикла;

Просьба, описать конкретные чудодейственные свойства этой конструкции, если можно с примерами. Одним словом по делу, четко, понятно и с пояснениями.

Для себя и будущих поколений! Спасибо.
1 PR
 
25.09.18
17:41
Ты, главное,не останавливайся, даешь еще парочку туповеток!
2 Лефмихалыч
 
25.09.18
17:42
это - говнокод.


еще вопросы?
3 Волшебник
 
25.09.18
17:42
(0) Суперкомпьютер IBM прокручивает бесконечный цикл за 5 секунд.
4 tesseract
 
25.09.18
17:43
Что ты по одному ты выкладываешь?  
Вот тут много примеров : https://www.govnokod.ru
5 prtx
 
25.09.18
17:44
(1) я задаю вопросы в ответах на которые сомневаюсь, и на которые на просторох интернета не наше "путевых" статей.
https://www.google.com.ua/search?newwindow=1&rlz=1C1CHZL_ruUA768UA768&ei=fTeqW63iGoLorgSCkazoCA&q=1с+Пока+Истина+Цикл&oq=1с+Пока+Истина+Цикл&gs_l=psy-ab.12..0i71k1l8.0.0.0.4654830.0.0.0.0.0.0.0.0..0.0....0...1..64.psy-ab..0.0.0....0.negXwsoG3PQ

первые две ссылки и все...
6 FIXXXL
 
25.09.18
17:44
// тут мы занимаевся всякой фиговиной и в зависимости от условий присваиваем Выводить = Истина;
Иначе
  Прервать;
7 Лефмихалыч
 
25.09.18
17:47
(3) дважды?
8 igork1966
 
25.09.18
18:10
(0) http://progmatem.ru/pascal/while-and-repeat.html
Просто в некоторых языках есть больше вариантов циклов.
Этой конструкцией имитируют цикл с постусловием (REPEAT-UNTIL)
9 igork1966
 
25.09.18
18:13
(8) + есть опасность устроить бесконечный цикл.

PS. Без внятной необходимости я бы постарался не использовать.
10 tesseract
 
25.09.18
18:15
(8) В данном случае отличия while от repeat никакого.  


Пока Выводить Цикл

КонецЦикла;

Сделает то-же самое.
11 igork1966
 
25.09.18
18:19
(10) Мне лень анализировать зачем в (0) так извращаются....
;-)
12 igork1966
 
25.09.18
18:20
(11) + уж я молчу что подобное можно сделать с помощью goto
;-))))
13 lEvGl
 
гуру
25.09.18
18:41
(0) а что там непонятного
14 APXi
 
25.09.18
18:59
Отчет должен сформировать 1 или более раз.
15 Остап Сулейманович
 
25.09.18
19:00
(10) А если там таких "Выводить" штук 12?
Тогда
Ваше
Пока Выводить Цикл
превращается в
Пока Выводить1 И Выводить2 И Выводить3 .<где-то там конец строки...>. Цикл

А потом еще финт такого плана (что б соблюстить))) ):
Если НЕ ВыводитьN  Тогда
  Продолжить; // Типа в заголовке проверим а оно - не оно. И выйдем с цикла.
КонецЕсли;


А так все просто
Пока Истина Цикл
  Если НЕ Выводить1 Тогда
    Прервать;
  КонецЕсли;
  ..
  Если НЕ Выводить2 Тогда
    Прервать;
  КонецЕсли;
  ..
КонецЦикла;
16 Остап Сулейманович
 
25.09.18
19:02
(14) Не отчет. А цикл. С отчетом - непонятно.
17 exwill
 
25.09.18
19:14
(0) А что тебе не нравится, собственно?
Цикл, как цикл.
18 lEvGl
 
гуру
25.09.18
19:18
ну как бэ писать пока истина цикл - дурной тон, но и криминала тут невидно
19 exwill
 
25.09.18
19:21
(18) Что в этом дурного?
20 sechs
 
25.09.18
19:33
(18) https://github.com/id-Software/Quake/blob/master/QW/server/sys_win.c#L236

А пацаны-то и не в курсе...
21 Сияющий в темноте
 
25.09.18
22:37
Просто,в 1с поленились сделать инструкцию НачалоЦикла,очень бы хорошо заменила данную конструкцию.
22 tesseract
 
25.09.18
22:42
(15) Это декомпилятор вам сказал или воображение?

(21) А зачем вводить избыточную конструкцию? Какая разница, где идет проверка в начале или конце цикла? Выполнение лишнего безусловного перехода в польской виртмашине - фактически бесплатное.
23 Сияющий в темноте
 
25.09.18
22:57
(22)не удивлюсь что интерпретатор выкидывает проверку условия,если там написано истина.

а вот конечного While или Until не хватает явно.
24 tesseract
 
26.09.18
00:26
(23) Интерпретатор выкидывает проверку просто.

>>а вот конечного While или Until не хватает явно.

Это скука по паскалю или фортрану.
25 MSOliver
 
26.09.18
05:12
"Пока Истина Цикл" - встречается в типовой УТ 11.4 - раз двадцать, так что к данной конструкции претензий быть не должно...
26 dmitn
 
26.09.18
05:26
Например,

Функция НайтиЭлемент(Элемент_HTML, НазваниеТега)
    
    ТекущийЭлемент_HTML = Элемент_HTML;
    Пока Истина Цикл
        Если ТекущийЭлемент_HTML.tagName = "BODY" Тогда
            Возврат Неопределено;
        ИначеЕсли ТекущийЭлемент_HTML.tagName = НазваниеТега Тогда
            Возврат ТекущийЭлемент_HTML;
        Иначе
            ТекущийЭлемент_HTML = ТекущийЭлемент_HTML.parentNode;
        КонецЕсли;
    КонецЦикла;
    
КонецФункции

Цикл будет бесконечно крутиться, пока переменная не примет конкретное значение.
27 Лефмихалыч
 
26.09.18
09:19
(20) ты показываешь пример цикла, который реально обязан быть вечным, пока программа запущена. В топике вообще совсем другой случай.
28 Rovan
 
гуру
26.09.18
09:25
(0) ОбластьМакета - каждый раз разная
29 Лефмихалыч
 
26.09.18
09:35
любые аргументы в пользу того, что вечный цикл - это нормально, сродни аргументам в пользу того, что носки можно и не стирать. Можно. Просто есть цена у этого.
30 Пробел
 
26.09.18
09:42
хороший цикл, мне нравится) Правда, немного более требовательный к программисту.
31 Пробел
 
26.09.18
09:45
(0) цикл крутится пока "Выводить" не примет значение "ложь". Удобно, когда у тебя проблемы с определением нужного количества итераций или тебе лень его определять.
32 Малыш Джон
 
26.09.18
09:49
(0) это говнокод.

Если уж так хочется поизвращаться, то так нагляднее:
Выводить = Истина;
//...
Пока Выводить Цикл          
                
// тут мы занимаемся всякой фиговиной и в зависимости от условий присваиваем Выводить = Ложь;

Если Выводить Тогда
  ТабДокумент.Вывести(ОбластьМакета);
КонецЕсли;
            
КонецЦикла;
33 bolobol
 
26.09.18
09:53
(20) Нажал перевод, по подсказке ЯБ, учитался!:

"// запустить один кадр сразу за первое сердцебиение
    SV_Frame (0.1);

//
// основной цикл
//
Олдтаймер = Sys_DoubleTime () - 0.1;
    хотя (1)
    {
    // выберите на чистое гнездо и stdin
    // единственная причина, у нас есть тайм-аут на все..."
34 SweetaAngel
 
26.09.18
10:02
(11) > Мне лень анализировать зачем в

Допустим происходит чтение EXEL, с неизвестным количеством строк, до определенной строки. Со сложным условием. Например, или до строчки с Итог или если пять последних строк были с пустой суммой.

Как сделать без
Пока Истина Цикл
или
ВполнятьЦикл = Истиан;

Пока ВполнятьЦикл  Цикл

?
35 bolobol
 
26.09.18
10:03
(34) Пока КолвоПустыхСтрок < 5 ?
36 Кирпич
 
26.09.18
10:05
(0) Всё нормально. Все циклы бесконечные и все прерываются по какому либо условию. Главное чтобы условие гарантированно сработало.
37 bolobol
 
26.09.18
10:11
(36) Зачем бесконечному циклу гарантированное срабатывание условия? Он же - безконечный! Выключил компьютер - цикл прекратился.
38 Малыш Джон
 
26.09.18
10:22
(37) ... перезагрузил сервер, отключил электричество, сбросил бомбу на электростанцию..
39 Кирпич
 
26.09.18
10:28
(37) "Выключил компьютер - цикл прекратился"
Возможно, но лучше на всякий случай условие поставить.
40 Сияющий в темноте
 
26.09.18
10:38
Иногда еще цикл используется для того,чтобы спятать goto.
Например,если в процессе работы нужно выйти из куска кода,но тогда в конце цикла обязательно стоит break
опять же,такой чудл цикл в 1с принято выносить в отдельную процедуру,где return вполне себе выполняет эти функции,но читаемость кода становится хуже.
41 bolobol
 
26.09.18
10:39
(38) (39) Это вам к (3)
42 bolobol
 
26.09.18
10:42
(40) "ПолучитьОкончаниеБесконечногоЦикла();" - ну... нет, с читаемостью всё в порядке, проблема в пейсателе.
43 bolobol
 
26.09.18
10:44
Или как сейчас принято: "НачатьОжиданиеОкончанияБесконечноЦикла()", чтобы система не повисла - спецом, именно для этого, придумали асинхронные вызовы))
44 SweetaAngel
 
26.09.18
10:55
(35) Там есть еще вариант, что слово "Итого".
45 Mr_Rm
 
26.09.18
12:09
(23) > не удивлюсь что интерпретатор выкидывает проверку условия,если там написано истина.
Нет, не выкидывает. Честно генерит
// Пока Истина Цикл
PushTrue
LineNo #
JZ ...
46 tesseract
 
26.09.18
12:22
(40) >>такой чудл цикл в 1с принято выносить в отдельную процедуру

Function on task - отличный шаблон проектирования, например когда делаешь рефакторинг, он позволяет избавляться от побочных влияний и оптимизировать количество переменных.

(43) Ты не поверишь -  все компы, контроллеры штор и прочие вибраторы работают на бесконечном цикле обработки прерываний :-)
47 bolobol
 
26.09.18
12:24
(46) Вы меня с кем-то перепутали
48 Cool_Profi
 
26.09.18
12:25
(46) "Ты не поверишь -  все компы"
Не поверю. Прерывания вызываются коллбеками, а не крутят цикл.
49 VIPetriv
 
26.09.18
12:41
(26) В этом примере лучше вместо "Истина" поставить проверку на ноль: "ТекущийЭлемент_HTML <> неопределено".
И вообще бесконечные циклы делать не стоит, лучше сделать "ДЛЯ н = 1 по 100000 ЦИКЛ" программу тупить меньше будет в критических ситуациях.
50 tesseract
 
26.09.18
12:42
(47) Вроде нет - асинхронные вызовы в любом случае имеют встроенный цикл обработки сообщений. Всякий синтаксический сахар - всего лишь обертка.

(48) у callback уже нет точки входа и возврата? И стэк им уже не нужен ?
51 Cool_Profi
 
26.09.18
12:44
(50) Ну не циклами они же проверяются. А аппаратными (или вызовами ядра) прерываниями
52 Eiffil123
 
26.09.18
12:50
А что плохого. Я таким циклом часто из табдока инфу загружаю, когда заранее неизвестно количество строк.
53 tesseract
 
26.09.18
12:53
(51) А чем еще? Всегда есть цикл, который обрабатывает.


int main()
{
}
54 Cool_Profi
 
26.09.18
12:55
(53) Неа. В программе есть обычный воркфлоу.
При возникновении прерыывания - воркфлоу останавливается и управление передаётся обработчику этого прерывания.
Такая же картина и в многозадачных системах, только там не аппаратное прерывание, а шедулер задач останавливает поток и вызывает зарегистрированный коллбек
55 tesseract
 
26.09.18
13:00
(54) А что такое воркфлоу?  Куда в итоге все коллбэки попадают?
56 Cool_Profi
 
26.09.18
13:02
(55) Воркфлоу - это то, чем занимается программа для своих нужд.
Что значит - куда попадают? Они регистрируются в отдельной таблице, и когда событие возникает - из этой таблицы выбирается обработчик
57 los_hooliganos
 
26.09.18
13:24
Причем тут метки? Это обычная управляющая конструкция. Для упр конструкции "Пока Истина Цикл" есть Прервать и Продолжить и Возврат (если это функция).
Минус этой конструкции в том, что сложно найти ошибки в большом/длинном цикле, поэтому она должна быть максимально простой.
58 los_hooliganos
 
26.09.18
13:24
(57) точнее "Возврат, если это Процедура"
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой