На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (12) « Первая ... 2 3 [4] 5 6 ...  11 12 все  ( Перейти к последнему сообщению )  
> Сохранение и восстановление состояния обработки
    Цитата korvin @
    Как обычно, ответ не по существу и ни о чём.

    По-моему очень хороший и конкретный ответ на конкретную реплику про отношение к мнению других. Наплевать на мнение других людей ты можешь тогда, когда один работаешь. А так с goto у тебя точно будут приключения в команде.
    Если тебе это подходит, то ок :-?
    Ну или может быть команда скажет, что ок (я бы, наверное, заапрувил PR с таким использованием goto, хотя тоже зависит от), значит тоже все в порядке. Но я думаю, что код будет вызывать споры на ревью, а потом еще вопросы у каждого нового человека, который будет этот код смотреть.
      Цитата D_KEY @
      И думаю, что каждый человек, который будет видеть этот код с goto, будет задавать вопросы
      :offtop:К слову сказать. В каждой кампании есть определённые стандарты. На то, на сё. Не секрет. У нас они тоже есть. Я всегда (!) джунам говорю так: «Стандарты нужны, т.к. без них будет анархия. В анархии разбираться всегда сложно и дорого. Вы пришли, вам теперь курить, что понасоздано до вас вашими коллегами. После вас кто-то придёт и будет курить созданное вами. Анархия — зло. Так что будьте добры соблюдать стандарты. Чего бы там ни было. Это самое простое, что можно сделать, чтобы легко и быстро влиться в процесс и начинать приносить кампании пользу. Но. :jokingly: Любая крайность тоже зло. Жить строго по уставу нельзя. Любой закон имеет сферу применимости. Даже УК ограничен, к военным, например, он имеет опосредованное отношение. Я не хочу, чтобы вы знали стандарты назубок, я хочу, чтобы вы понимали, почему они такие. Когда я спрошу, откуда взялся вот этот вот конкретный пункт и почему он сформулирован не как-нибудь иначе, и вы сможете внятно ответить, вы мидлы. А если в вашей деятельности встретится ситуация, когда следование букве стандарта вредит его духу, то вы не должны бояться нарушить первое ради сохранения второго. Да, вам будут задавать вопросы типа "почему так", "с чего это ты вдруг решил..." и даже "не ахренел ли ты". Если вы готовы и на них отвечать, значит вы сеньоры. Но до тех пор, пока вы не сеньоры и даже не мидлы, стандарты ваше всё.»/:offtop:
        Вот что нашел=)

        Цитата D_KEY @
        У них разные initValue :)
        По поводу оптимизации - надо мерить.

        Добавлено
        Пока получается что-то вроде того:
        ExpandedWrap disabled
          int i = 0, j = 0, k = 0;
          if (restore(&i, &j, &k))
              goto resume;
           
          for(i = 0; i < 10; ++i) {
            for (j = i; j < 10; ++j) {
              for(k = j; k < 10; ++k) {
          resume:
               // ...
           
              }
            }
          }


        vs

        ExpandedWrap disabled
          int i = 0, j = 0, k = 0;
          restore(&i, &j, &k);
           
          for(; i < 10; ++i, j = i, k = j) {
            for (; j < 10; ++j, k = j) {
              for(; k < 10; ++k) {
           
                // ...
           
              }
            }
          }


        vs

        ExpandedWrap disabled
          int init_i = 0, init_j = 0, init_k = 0;
          bool is_init = restore(&init_i, &init_j, &init_k);
           
          for(int i = is_init ? init_i : 0; i < 10; ++i) {
            for (int j = is_init ? init_j : i; j < 10; ++j) {
              for(int k = is_init ? init_k : j; k < 10; ++k) {
           
                // ...
           
              }
            }
          }


        Мне кажется, что вариант с goto понятнее... Хотя второй тоже неплох, на мой взгляд.

        goto vs break & continue (сообщение #3594314)

        Там в окрестностях тоже интересно почитать :)
        Сообщение отредактировано: D_KEY -
          Цитата Majestio @
          Спешал фор Киля!

          Я знаю твою лютую, можно сказать - бешенную ненависть к прекрасному оператору GOTO. Специально для тебя лучшие умы Сколково уже давно придумали "case-switch" подход. На языке программирования Цэ это будет примерно так:

          Я goto юзал только в образовательных целях, case-switch - юзал может быть пару раз, и то скорее всего мне было лень думать, либо там был несущественный участок кода, где он как то вписывался. switch-case - по факту не несет какого то негативного оттенка, не имею против него ничего. Но - лично мне не нравится он из за того что очень сильно захламляет код - по сути метод/функция - содержащая switch - превращается в одну большую портянку. И чем больше case в switch - тем длинее портянка, ну и плюс ко всему - он очень сильно ограничен в своих возможностях, прям сильно, если бы не было таких ограничений(он требует константых выражений, в отличии от if например), то возможно бы я чаще его применял. По этому по возможности стараюсь избегать его, не то что он плохой, а просто потому что у меня к нему предвзятое отношение, неудобно потом мотать его, ну и у него очень ограниченный спектр применений.

          Ну а по теме, я пока остаюсь при своем мнении. Ни одного аргумента оправданного применения goto пока не привели. Все примеры синтетические, высосаные из пальца, типа: Попробуй без goto запрыгнуть в 10-вложенный цикл for, а че не можешь? Ну все, значит goto рулит.
          Лично мое мнение - если так стоит вопрос, значит у тебя уже проблемы, и ты пытаешься их костылями исправить.
          Сообщение отредактировано: Wound -
            Цитата Majestio @
            Какие варианты, кроме как использовать метки и оператор goto, могут быть для решения данного вопроса?

            С ходу вижу 2 решения:
            1) засунуть всю эту процедуру в отдельный поток и дальше синхронизироваться сообщениями.
            2) сделать инициализацию параметров. таким образом, на каждой итерации нужный идекс будет увеличиваться, а при старте функции все индексы тут восстановлены из массива.
              Ну што, пришло время предложить челендж!

              Конечно все эти много-вложенные циклы - баловство. В реальности же чаще бывает гораздо проще. Но бывает и ппц. Это касается алгоритмов, где количество обрабатываемых параметров 100500, да и если они еще отчасти взаимозависимы. Нижеприведенный пример конечно чистая синтетика, и очень упрощенная. Но, уверяю, и не такое бывает в сложных системах. Подобный фарш я программил лет 15 назад. Проект назывался "Робот обновлений Консультант Плюс". Невыносимое количество условий и параметров для их выполнения.

              Поехали

              Вот блок-схема алгоритма работы (восстановление работы, сиречь, "впрыгивание" в точки сохранения - на блок-схеме нет):

              user posted image

              Условия
              • Есть вектор из четырех числовых ячеек, на старте они все обнулены
              • Есть четыре процесса (по сути - функции), каждый из которых обрабатывает свою ячейку
              • У каждого процесса свой алгоритм обработки
              • Процесс считаем неделимым, т.е. внутри остановиться нельзя
              • Точки сохранения и восстановления располагаем перед каждым процессом
              • В зависимости от пост-условий обработки процесс может вернуть два состояния: false и true

              Условия челенджа
              1. Я привожу условия обработки и эталонный набор данных
              2. Вы пишете программу, которая должна повторить "эталонную" обработку
              3. В программе должна быть предусмотрена вторая часть - продолжить обработку с определенного состояния
              4. Состояния не обязательно записывать на диск, можно просто для второй части вписать данные перед определенной точкой останова
              Прошу - не спойлерить!

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

              Вводные данные

              Процесс-1

              Безусловный инкремент нулевой ячейки массива.

              Процесс-2

              Ячейку1 увеличивает на содержимое Ячейки3 + 1

              Процесс-3

              Если сумма Ячейки0 и Ячейки1 НЕ делиться нацело на три, то Ячейку2 увеличиваем на 7

              Процесс-4

              Если сумма Ячейки0 и Ячейки2 деленная по модулю 5 не равна 4 - увеличиваем Ячейку3 на еденицу

              Проверка-1

              Возвращает true, если сумма всех ячеек кратна 2, иначе false

              Проверка-2

              Возвращает true, если сумма всех ячеек деленная по модулю 7 больше нуля, иначе false

              Проверка-3

              Возвращает true, если числа всех ячеек четные, иначе false

              Проверка-4

              Возвращает true, если сумма всех ячеек больше 24, иначе false

              "Эталонные вычисления"

              ExpandedWrap disabled
                Step: 0     Proc: 1     0   0   0   0
                Step: 1     Proc: 3     1   0   0   0
                Step: 2     Proc: 1     1   0   7   0
                Step: 3     Proc: 3     2   0   7   0
                Step: 4     Proc: 2     2   0   14  0
                Step: 5     Proc: 3     2   1   14  0
                Step: 6     Proc: 1     2   1   14  0
                Step: 7     Proc: 4     3   1   14  0
                Step: 8     Proc: 2     3   1   14  1
                Step: 9     Proc: 4     3   3   14  1
                Step: 10    Proc: 2     3   3   14  2
                Step: 11    Proc: 3     3   6   14  2
                Step: 12    Proc: 1     3   6   14  2
                Step: 13    Proc: 4     4   6   14  2
                Step: 14    Proc: 5     4   6   14  3
                ----------------------------------------------------------------
                Step: 9     Proc: 4     3   3   14  1
                Step: 10    Proc: 2     3   3   14  2
                Step: 11    Proc: 3     3   6   14  2
                Step: 12    Proc: 1     3   6   14  2
                Step: 13    Proc: 4     4   6   14  2
                Step: 14    Proc: 5     4   6   14  3
                ----------------------------------------------------------------


              Смотрим.

              На нулевом шаге имеем в ячейках нули и начали обрабатывать Процессом-1.
              На первом шаге, после Процесса-1, видим, что нулевая ячейка инкрементировалась. А обрабатывает этот шаг Процесс-3
              На втором шаге после Процесса-3, видим, что вторая ячейка получила значение 7. А обрабатывает этот шаг Процесс-1
              .. ну и так далее, до разделительной линии
              На последнем шаге-14 (всего 15 шагов) ячейки получили значения 4,6,14, 3 - ну а Proc-5 - это просто "окончательный выход из обработки"

              Вторая часть того же алгоритма. Но заход в него будет не со значений Процесс-1, ячейки (0,0,0,0), а с якобы "сохраненного" состояния - Процесс-4, ячейки (3,3,14,1)
              Видим часть "довычислений", видим результаты идентичные. Я и номер шага сохранял, но это лишнее.

              Свою программу на С++ прикрепляю запароленным архивом.

              Вэлком - покажите себя на деле! Ценим компактность и понятность кода, естественно идентичность тестовых расчетов.

              Прикреплённый файлПрикреплённый файлmajestio_algo.cpp.7z (794 байт, скачиваний: 36)
                Цитата Majestio @
                Вот блок-схема алгоритма работы

                Скажи, а ты специально так всё расположил, чтобы сделать лапшу из стрелок?
                Прикреплённая картинка
                Прикреплённая картинка
                  Majestio, для решения подобных задач существует стандартный метод. И его все хорошо знают. Не удивлюсь, если бо́льшая часть решений будет основана на нём. Другое дело, что для синтетики с простыми Процессами она очень накладна.
                    Цитата korvin @
                    Скажи, а ты специально так всё расположил, чтобы сделать лапшу из стрелок?

                    Не специально, честно. Кстати, а ты в чем рисовал?

                    Добавлено
                    Цитата Qraizer @
                    Majestio, для решения подобных задач существует стандартный метод. И его все хорошо знают. Не удивлюсь, если бо́льшая часть решений будет основана на нём. Другое дело, что для синтетики с простыми Процессами она очень накладна.

                    Ну пусть будем думать, что процессов не 4, а 50. Ну так, на перспективу :rolleyes:
                      Цитата Majestio @
                      Кстати, а ты в чем рисовал?

                      OmniGraffle
                        Цитата korvin @
                        OmniGraffle

                        Ниче так получилось, и шрифты красивые. А я в какой-то онлайн-хрени нарисовал по-быстрому.
                          Цитата Majestio @
                          шрифты красивые

                          Шрифты Iosevka — качай да пользуйся.
                            Цитата Majestio @
                            Ну пусть будем думать, что процессов не 4, а 50. Ну так, на перспективу
                            Та без разницы. Накладные тоже возрастут пропорционально.
                              Совершенно непонятно, как должны работать «точки останова» и как симулировать останов в программе.
                              Прикреплённый файлПрикреплённый файлmajestio_state_machine.ml.zip (1,24 Кбайт, скачиваний: 43)
                                Цитата korvin @
                                Совершенно непонятно, как должны работать «точки останова» и как симулировать останов в программе.

                                Ну в реальности можно все это выносить в отдельный поток, а на точках останова чекать атомарную переменную на предмет необходимости останова и сброса состояния на диск. Как самый элементарный вариант.

                                Цитата korvin @
                                Iosevka

                                Благодарю! Нашел, скачал, щя смогу тоже наводить красоту :lol: Вот еще похожий ничегошный так - Pragmata.

                                Добавлено
                                Цитата Qraizer @
                                Та без разницы. Накладные тоже возрастут пропорционально.

                                Ну ок. Будет оказия - прими участие вот тут :rolleyes:
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (12) « Первая ... 2 3 [4] 5 6 ...  11 12 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0987 ]   [ 22 queries used ]   [ Generated: 6.05.24, 09:40 GMT ]