
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.75] |
![]() |
|
Страницы: (12) « Первая ... 2 3 [4] 5 6 ... 11 12 все ( Перейти к последнему сообщению ) |
Сообщ.
#46
,
|
|
|
По-моему очень хороший и конкретный ответ на конкретную реплику про отношение к мнению других. Наплевать на мнение других людей ты можешь тогда, когда один работаешь. А так с goto у тебя точно будут приключения в команде. Если тебе это подходит, то ок ![]() Ну или может быть команда скажет, что ок (я бы, наверное, заапрувил PR с таким использованием goto, хотя тоже зависит от), значит тоже все в порядке. Но я думаю, что код будет вызывать споры на ревью, а потом еще вопросы у каждого нового человека, который будет этот код смотреть. |
![]() |
Сообщ.
#47
,
|
|
Цитата D_KEY @ И думаю, что каждый человек, который будет видеть этот код с goto, будет задавать вопросы ![]() ![]() ![]() |
Сообщ.
#48
,
|
|
|
Вот что нашел=)
Цитата D_KEY @ У них разные initValue ![]() По поводу оптимизации - надо мерить. Добавлено Пока получается что-то вроде того: ![]() ![]() 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 ![]() ![]() 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 ![]() ![]() 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) Там в окрестностях тоже интересно почитать ![]() |
Сообщ.
#49
,
|
|
|
Цитата Majestio @ Спешал фор Киля! Я знаю твою лютую, можно сказать - бешенную ненависть к прекрасному оператору GOTO. Специально для тебя лучшие умы Сколково уже давно придумали "case-switch" подход. На языке программирования Цэ это будет примерно так: Я goto юзал только в образовательных целях, case-switch - юзал может быть пару раз, и то скорее всего мне было лень думать, либо там был несущественный участок кода, где он как то вписывался. switch-case - по факту не несет какого то негативного оттенка, не имею против него ничего. Но - лично мне не нравится он из за того что очень сильно захламляет код - по сути метод/функция - содержащая switch - превращается в одну большую портянку. И чем больше case в switch - тем длинее портянка, ну и плюс ко всему - он очень сильно ограничен в своих возможностях, прям сильно, если бы не было таких ограничений(он требует константых выражений, в отличии от if например), то возможно бы я чаще его применял. По этому по возможности стараюсь избегать его, не то что он плохой, а просто потому что у меня к нему предвзятое отношение, неудобно потом мотать его, ну и у него очень ограниченный спектр применений. Ну а по теме, я пока остаюсь при своем мнении. Ни одного аргумента оправданного применения goto пока не привели. Все примеры синтетические, высосаные из пальца, типа: Попробуй без goto запрыгнуть в 10-вложенный цикл for, а че не можешь? Ну все, значит goto рулит. Лично мое мнение - если так стоит вопрос, значит у тебя уже проблемы, и ты пытаешься их костылями исправить. |
![]() |
Сообщ.
#50
,
|
|
Цитата Majestio @ Какие варианты, кроме как использовать метки и оператор goto, могут быть для решения данного вопроса? С ходу вижу 2 решения: 1) засунуть всю эту процедуру в отдельный поток и дальше синхронизироваться сообщениями. 2) сделать инициализацию параметров. таким образом, на каждой итерации нужный идекс будет увеличиваться, а при старте функции все индексы тут восстановлены из массива. |
Сообщ.
#51
,
|
|
|
Ну што, пришло время предложить челендж!
Конечно все эти много-вложенные циклы - баловство. В реальности же чаще бывает гораздо проще. Но бывает и ппц. Это касается алгоритмов, где количество обрабатываемых параметров 100500, да и если они еще отчасти взаимозависимы. Нижеприведенный пример конечно чистая синтетика, и очень упрощенная. Но, уверяю, и не такое бывает в сложных системах. Подобный фарш я программил лет 15 назад. Проект назывался "Робот обновлений Консультант Плюс". Невыносимое количество условий и параметров для их выполнения. Поехали Вот блок-схема алгоритма работы (восстановление работы, сиречь, "впрыгивание" в точки сохранения - на блок-схеме нет): ![]() Условия Условия челенджа Прошу - не спойлерить! Написали программу, присоединили шифрованным архивом, архивы паролями вскроем через недельку, как все заинтересованные отпишутся. Желательно писать программу так, чтобы можно было бы ее прогнать в онлайн-компиляторе. Вводные данные Процесс-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 "Эталонные вычисления" ![]() ![]() 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) Видим часть "довычислений", видим результаты идентичные. Я и номер шага сохранял, но это лишнее. Свою программу на С++ прикрепляю запароленным архивом. Вэлком - покажите себя на деле! Ценим компактность и понятность кода, естественно идентичность тестовых расчетов. Прикреплённый файл ![]() |
![]() |
Сообщ.
#52
,
|
|
![]() |
Сообщ.
#53
,
|
|
Majestio, для решения подобных задач существует стандартный метод. И его все хорошо знают. Не удивлюсь, если бо́льшая часть решений будет основана на нём. Другое дело, что для синтетики с простыми Процессами она очень накладна.
|
Сообщ.
#54
,
|
|
|
Цитата korvin @ Скажи, а ты специально так всё расположил, чтобы сделать лапшу из стрелок? Не специально, честно. Кстати, а ты в чем рисовал? Добавлено Цитата Qraizer @ Majestio, для решения подобных задач существует стандартный метод. И его все хорошо знают. Не удивлюсь, если бо́льшая часть решений будет основана на нём. Другое дело, что для синтетики с простыми Процессами она очень накладна. Ну пусть будем думать, что процессов не 4, а 50. Ну так, на перспективу ![]() |
![]() |
Сообщ.
#55
,
|
|
Цитата Majestio @ Кстати, а ты в чем рисовал? OmniGraffle |
Сообщ.
#56
,
|
|
|
Цитата korvin @ OmniGraffle Ниче так получилось, и шрифты красивые. А я в какой-то онлайн-хрени нарисовал по-быстрому. |
![]() |
Сообщ.
#57
,
|
|
Цитата Majestio @ шрифты красивые Шрифты Iosevka — качай да пользуйся. |
![]() |
Сообщ.
#58
,
|
|
Цитата Majestio @ Та без разницы. Накладные тоже возрастут пропорционально. Ну пусть будем думать, что процессов не 4, а 50. Ну так, на перспективу |
![]() |
Сообщ.
#59
,
|
|
Совершенно непонятно, как должны работать «точки останова» и как симулировать останов в программе.
Прикреплённый файл ![]() |
Сообщ.
#60
,
|
|
|
Цитата korvin @ Совершенно непонятно, как должны работать «точки останова» и как симулировать останов в программе. Ну в реальности можно все это выносить в отдельный поток, а на точках останова чекать атомарную переменную на предмет необходимости останова и сброса состояния на диск. Как самый элементарный вариант. Цитата korvin @ Iosevka Благодарю! Нашел, скачал, щя смогу тоже наводить красоту ![]() Добавлено Цитата Qraizer @ Та без разницы. Накладные тоже возрастут пропорционально. Ну ок. Будет оказия - прими участие вот тут ![]() |