Вход | Регистрация



Пока Истина Цикл

Пока Истина Цикл
Я
   prtx
 
25.09.18 - 17:39
Собственно вопрос в конструкции кот. указана в заголовке.

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

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


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

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

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


еще вопросы?
   Волшебник
 
3 - 25.09.18 - 17:42
(0) Суперкомпьютер IBM прокручивает бесконечный цикл за 5 секунд.
   tesseract
 
4 - 25.09.18 - 17:43
Что ты по одному ты выкладываешь?  
Вот тут много примеров : https://www.govnokod.ru
   prtx
 
5 - 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

первые две ссылки и все...
   FIXXXL
 
6 - 25.09.18 - 17:44
// тут мы занимаевся всякой фиговиной и в зависимости от условий присваиваем Выводить = Истина;

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

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


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

КонецЦикла; 

Сделает то-же самое.
 
 Рекламное место пустует
   igork1966
 
11 - 25.09.18 - 18:19
(10) Мне лень анализировать зачем в (0) так извращаются....
;-)
   igork1966
 
12 - 25.09.18 - 18:20
(11) + уж я молчу что подобное можно сделать с помощью goto
;-))))
   lEvGl
 
13 - 25.09.18 - 18:41
(0) а что там непонятного
   APXi
 
14 - 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) Не отчет. А цикл. С отчетом - непонятно.
   exwill
 
17 - 25.09.18 - 19:14
(0) А что тебе не нравится, собственно?
Цикл, как цикл.
   lEvGl
 
18 - 25.09.18 - 19:18
ну как бэ писать пока истина цикл - дурной тон, но и криминала тут невидно
   exwill
 
19 - 25.09.18 - 19:21
(18) Что в этом дурного?
   sechs
 
20 - 25.09.18 - 19:33
   Сияющий в темноте
 
21 - 25.09.18 - 22:37
Просто,в 1с поленились сделать инструкцию НачалоЦикла,очень бы хорошо заменила данную конструкцию.
   tesseract
 
22 - 25.09.18 - 22:42
(15) Это декомпилятор вам сказал или воображение?

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

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

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

Это скука по паскалю или фортрану.
   MSOliver
 
25 - 26.09.18 - 05:12
"Пока Истина Цикл" - встречается в типовой УТ 11.4 - раз двадцать, так что к данной конструкции претензий быть не должно...
   dmitn
 
26 - 26.09.18 - 05:26
Например,
Функция НайтиЭлемент(Элемент_HTML, НазваниеТега)
    
    ТекущийЭлемент_HTML = Элемент_HTML;
    Пока Истина Цикл
        Если ТекущийЭлемент_HTML.tagName = "BODY" Тогда
            Возврат Неопределено;
        ИначеЕсли ТекущийЭлемент_HTML.tagName = НазваниеТега Тогда
            Возврат ТекущийЭлемент_HTML;
        Иначе
            ТекущийЭлемент_HTML = ТекущийЭлемент_HTML.parentNode;
        КонецЕсли;
    КонецЦикла;
    
КонецФункции

Цикл будет бесконечно крутиться, пока переменная не примет конкретное значение.
   Лефмихалыч
 
27 - 26.09.18 - 09:19
(20) ты показываешь пример цикла, который реально обязан быть вечным, пока программа запущена. В топике вообще совсем другой случай.
   Rovan
 
28 - 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) это говнокод.

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

Пока Выводить Цикл           
                
// тут мы занимаемся всякой фиговиной и в зависимости от условий присваиваем Выводить = Ложь;


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

"// запустить один кадр сразу за первое сердцебиение

    SV_Frame (0.1); 

//

// основной цикл
//

 Олдтаймер = Sys_DoubleTime () - 0.1;
    хотя (1)
    {
    // выберите на чистое гнездо и stdin

    // единственная причина, у нас есть тайм-аут на все..."
 
 
   SweetaAngel
 
34 - 26.09.18 - 10:02
(11) > Мне лень анализировать зачем в

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

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

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

?
   bolobol
 
35 - 26.09.18 - 10:03
(34) Пока КолвоПустыхСтрок < 5 ?
   Кирпич
 
36 - 26.09.18 - 10:05
(0) Всё нормально. Все циклы бесконечные и все прерываются по какому либо условию. Главное чтобы условие гарантированно сработало.
   bolobol
 
37 - 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 вполне себе выполняет эти функции,но читаемость кода становится хуже.
   bolobol
 
41 - 26.09.18 - 10:39
(38) (39) Это вам к (3)
   bolobol
 
42 - 26.09.18 - 10:42
(40) "ПолучитьОкончаниеБесконечногоЦикла();" - ну... нет, с читаемостью всё в порядке, проблема в пейсателе.
   bolobol
 
43 - 26.09.18 - 10:44
Или как сейчас принято: "НачатьОжиданиеОкончанияБесконечноЦикла()", чтобы система не повисла - спецом, именно для этого, придумали асинхронные вызовы))
   SweetaAngel
 
44 - 26.09.18 - 10:55
(35) Там есть еще вариант, что слово "Итого".
   Mr_Rm
 
45 - 26.09.18 - 12:09
(23) > не удивлюсь что интерпретатор выкидывает проверку условия,если там написано истина.
Нет, не выкидывает. Честно генерит
// Пока Истина Цикл

 PushTrue
 LineNo #
JZ ...
   tesseract
 
46 - 26.09.18 - 12:22
(40) >>такой чудл цикл в 1с принято выносить в отдельную процедуру

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

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

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


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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует