-
- Это посмотреть: Пpocтo_зaшeл(1 знак., Сегодня, 17:05,
, ссылка)
- Вы бы для начала указали: автомат Мили или Мура? Пaлыч(219 знак., Вчера, 18:15)
- Следующее состояние автомата зависит от предыдущего? Если однозначно, то можно просто перед выходом писАть в ячейку с указателем точку следующего входа. Тогда ничего парсить не придётся. Если рандомайз, то может, флажки-фильтры прикрутить, по аналогии с онлайн-магазинами? Тогда каждое сравнение уменьшает ареал поиска наполовину, итого имеем 8 переборов вместо 256-ти. )) - vpv.vpv(Вчера, 07:25)
- Все что пробовал еще более громоздко. Делаю if-ы с goto. Ну и *Дункельсовские prototreads для совсем элементарных вещей (задержки и т.п.). - Скрипач(12.04.2019 14:37 - 15.04.2019 14:41)
- Пример. Блин. Хотел поправить отступы, глюкнул редактор, удалился
текст. Вечером верну пример назад. Cкpипaч(2098 знак., 12.04.2019 14:40 - Вчера, 18:14)
- Дикий трэш. Не в том месте скобочка, а в такой лапше ее легко пропустить - и "счастливой отладки!". - s_h_e(13.04.2019 09:17)
- В case пропустите break и получите в точности тоже самое. - Скрипач(14.04.2019 20:39)
- Если указать компилятору -Wall -Werror, то не будет соблазна
пропустить ошибку. Eddy_Em(117 знак., Вчера, 09:28)
- Эдуард, Спасибо. Полирую исходники перед сдачей проекта. Удалось
задушить предупреждения в проторедах для GCC таким макаром: Nikolay_Po(393 знак., Вчера, 22:10)
- Вот что-то мне эти "протопотоки" априори не нравятся. Настолько,
что даже документацию читать не хочется. Eddy_Em(712 знак., Вчера, 22:21)
- Смысл в том, что тебе не нужно разводить и перетряхивать кейзы
самостоятельно. Ты просто пишешь в каждом потоке линейный код. И
вызываешь все потоки по-очереди в мейн луп. А оно само двигает
кейзы внутри потока, таким образом, обеспечивая пошаговое, не
блоикрующее выполнение задачи. Nikolay_Po(49 знак., Вчера, 22:24)
- Не очень получается "облегчение труда без операционной системы". Сплошь и рядом: подача команды датчику на измерение и он ответит ...когда-нибудь. Тут сразу с "неблокирующим" получается казус и необходимо добавлять промежуточные состояния. Эта же задача с RTOS пишется просто до примитивности что положительно сказывается как на скорости реализации проекта так и на количестве багов. Впрочем с RTOS в полный рост встает задача IPC и синхронизации потоков. - 3m(Сегодня, 11:32)
- На это тратится один таймер и вешается супервизор? Или "потоки"
элементарно являются функциями, которые поочередно вызываются? Eddy_Em(44 знак., Вчера, 22:35)
- Со слов "Разберемся теперь, как работают макросы." Несколько
примеров исходников объяснят суть реализации pt. Nikolaj(1 знак., Сегодня, 08:10, ссылка)
- Ну, теперь я еще больше запутался: по ссылке - реализация обычных
конечных автоматов, но "спрятанная под ковер". Зачем? Наглядней же
делать все "в лоб". - Eddy_Em(Сегодня, 09:19)
- Ссылка - описание "в двух словах с картинками" того что реализовано в "protothread Adam Dunkels", про них речь выше шла. И в КА переходы между "ветками" кода в зависимости от условий/состояний. В pt в общем случае код функции-треда выполняется линейно с возможностью не блокированного ожидания выполнения условия (таймаут, ожидание смены состояния флага). - Nikolaj(Сегодня, 12:29)
- Затем, что расстановка и добавление кейсов делается препроцессором автоматически! Nikolay_Po(346 знак., Сегодня, 12:21)
- Ну, теперь я еще больше запутался: по ссылке - реализация обычных
конечных автоматов, но "спрятанная под ковер". Зачем? Наглядней же
делать все "в лоб". - Eddy_Em(Сегодня, 09:19)
- В двух словах не объяснить. А я хотел бы. Но сейчас готовлюсь к
сдаче проекта, нет возможности. Nikolay_Po(642 знак., Вчера, 23:14)
- Ну, у меня подобные задачи просто "вложенными" конечными автоматами
решаются. - Eddy_Em(Сегодня, 09:17)
- Именно. Просто ты ещё не задолбался писать конечные автоматы под простые, линейные, но блокирующие задачи. - Nikolay_Po(Сегодня, 12:15)
- Конечные автоматы пишутся легко и просто. Вот кусок реального кода,
где в главном цикле вызываются пять конечных автоматов
последовательно каждую миллисекунду. Некоторые автоматы в свою
очередь, вызывают другие автоматы. Главное, чтобы нигде и ничто не
могло блокировать поток выполнения. Бoмж(250 знак., Сегодня, 09:07)
- Так это вы мой мэйн луп показываете. Там примерно так же, условно 5 строчек. Nikolay_Po(79 знак., Сегодня, 12:14)
- Вот-вот. У меня примерно так же: Eddy_Em(1511 знак., Сегодня, 09:28)
- Ну, у меня подобные задачи просто "вложенными" конечными автоматами
решаются. - Eddy_Em(Сегодня, 09:17)
- Со слов "Разберемся теперь, как работают макросы." Несколько
примеров исходников объяснят суть реализации pt. Nikolaj(1 знак., Сегодня, 08:10, ссылка)
- Смысл в том, что тебе не нужно разводить и перетряхивать кейзы
самостоятельно. Ты просто пишешь в каждом потоке линейный код. И
вызываешь все потоки по-очереди в мейн луп. А оно само двигает
кейзы внутри потока, таким образом, обеспечивая пошаговое, не
блоикрующее выполнение задачи. Nikolay_Po(49 знак., Вчера, 22:24)
- Вот что-то мне эти "протопотоки" априори не нравятся. Настолько,
что даже документацию читать не хочется. Eddy_Em(712 знак., Вчера, 22:21)
- А может __attribute__ ((fallthrough))? - Nikolay_Po(Вчера, 09:50)
- Переключите компилятор в режим С++ и будет вам [[fallthrough]] средствами языка. А также многое другое. - VladislavS.(Сегодня, 08:28)
- Уже давно достаточно комментария. А раньше - да, приходилось макрос
определять и писать FALLTHRU() где нужно… Eddy_Em(33 знак., Вчера, 12:05)
- Руки бы поотрывал!!! С каких это пор, комментарии стали влиять на
компиляцию? С этих пор и стали. - Nikolay_Po(Вчера, 13:30)
- Очень даже удобно. Уж не помню, с какой версии, но эти прагмы для fallthrough писать перестало быть нужным. Я бы так и с остальными прагмами, потому как хрен запомнишь, что там надо - каждый раз гуглить приходится (а часто используемое в макросах определять - те же true inline). - Eddy_Em(Вчера, 13:59)
- Это догматизьм. До добра не доведёт. - SciFi(Вчера, 13:39)
- Вы догматитзьм с православием не путайте! - Kpoк(Вчера, 13:41)
- Руки бы поотрывал!!! С каких это пор, комментарии стали влиять на
компиляцию? С этих пор и стали. - Nikolay_Po(Вчера, 13:30)
- Эдуард, Спасибо. Полирую исходники перед сдачей проекта. Удалось
задушить предупреждения в проторедах для GCC таким макаром: Nikolay_Po(393 знак., Вчера, 22:10)
- В некоторых компиляторах от этого помогает ключ -Wimplicit-fallthrough. - s_h_e(15.04.2019 15:04)
- В большинстве случаев от этого помогает форматирование текста. - Скрипач(15.04.2019 15:05)
- Диска С - mse homjak(15.04.2019 18:08)
- У меня его нет. - Скрипач(15.04.2019 18:17)
- "Тогда удалите какие-нибудь важные файлы..."(С) - mse homjak(15.04.2019 19:10)
- Могу ~/tmp удалить. Устроит? - Скрипач(15.04.2019 19:12)
- "Тогда удалите какие-нибудь важные файлы..."(С) - mse homjak(15.04.2019 19:10)
- У меня его нет. - Скрипач(15.04.2019 18:17)
- Когда программизд втыкает в код охреневший, потому что надо было уже вчера, а нихрена не работает, может и не помогать. - s_h_e(15.04.2019 15:09)
- Диска С - mse homjak(15.04.2019 18:08)
- В большинстве случаев от этого помогает форматирование текста. - Скрипач(15.04.2019 15:05)
- Если указать компилятору -Wall -Werror, то не будет соблазна
пропустить ошибку. Eddy_Em(117 знак., Вчера, 09:28)
- В case пропустите break и получите в точности тоже самое. - Скрипач(14.04.2019 20:39)
- "увижу кого кто напишет гоуту - убью нахуй!" LordN(36 знак., 12.04.2019 14:50)
- Мой жизненный принцип: "...но не любой ценой". Скрипач(213 знак., 12.04.2019 14:54 - 15:09)
- В начале рисуем классический switch, где перебираем все возможные
состояния. Ну, а после него - еще один switch, который вызывает
return для всех ненужных состояний, а все нужные пропускает - чтобы
перейти к "хвосту" функции, который выполняется для нескольких
возможных состояний. Eddy_Em(383 знак., Вчера, 09:33)
- "Увижу функцию с несколькими точками выхода - убью нахуй" (C)
другой препод LightElf(88 знак., Вчера, 12:33)
- А что бы он сказал на функцию возвращающую разные типы? - VladislavS.(Вчера, 16:14)
- Фтопку! - LightElf(Вчера, 17:13)
- Ну, ХЗ. У меня зачастую бывают функции с одним-двумя десятками
return'ов внутри. Потому как goto - более злой враг ☺ Eddy_Em(206 знак., Вчера, 14:01)
- При отладке значительно удобнее иметь одну точку выхода - проще воткнуть печать или точку останова. Поэтому для меня множество return - это более злое зло. А goto - просто часть пейзажа, не мешает. Религиозные проклятия акадэмиков глубоко пофигу, тем более что они в этом вопросе друг другу противоречат. - LightElf(Вчера, 14:05)
- А что бы он сказал на функцию возвращающую разные типы? - VladislavS.(Вчера, 16:14)
- "Увижу функцию с несколькими точками выхода - убью нахуй" (C)
другой препод LightElf(88 знак., Вчера, 12:33)
- Припомнился вариант без явного GOTO Vit(748 знак., 15.04.2019 12:02)
- Мой вариант - намного лучше. Собственно состояния - прототридсы. goto это переход на мини блоки инициализации каждого из состояний. Скрипач(232 знак., 15.04.2019 12:20)
- Мой вариант самый лучший 😁😁😁 Бoмж(1140 знак., Вчера, 15:09)
- TimeMeasure++; -- милота :) - Cкpипaч(Вчера, 15:31)
- Для коротких задержек внутри одной из SM - отличное решение тем
более, что вызывается она раз в 1 миллисекунду (небольшой джиттер
здесь пофиг). Разумеется, есть и общепринятый таймер, но я не хотел
усложнять пример кода. - Бoмж(Вчера, 15:36 - 16:03)
- Отличия. Cкpипaч(224 знак., Вчера, 15:49)
- Вот пример с установкой выходов и переходом без потери цикла Бoмж(764 знак., Вчера, 15:59)
- Устанавливаем выходы в предыдущем состоянии? А если их несколько? Так не интересно. Cкpипaч(1 знак., Вчера, 18:15, ссылка)
- Вот пример с установкой выходов и переходом без потери цикла Бoмж(764 знак., Вчера, 15:59)
- Отличия. Cкpипaч(224 знак., Вчера, 15:49)
- Для коротких задержек внутри одной из SM - отличное решение тем
более, что вызывается она раз в 1 миллисекунду (небольшой джиттер
здесь пофиг). Разумеется, есть и общепринятый таймер, но я не хотел
усложнять пример кода. - Бoмж(Вчера, 15:36 - 16:03)
- TimeMeasure++; -- милота :) - Cкpипaч(Вчера, 15:31)
- Вопрос был как попасть из разных мест. А метка - хоть и точка входа на графе, но это и состояние. Хорошо, когда можно упростить, но иногда нужно и документировать. - Vit(15.04.2019 13:23)
- Именно что документировать. А не подменять документацию "осмысленными именами переменных". Вы правы в том смысле, что если уж пишем prototreads, то переход между состояниями КА неплохо бы сделать частью этой библиотеки. Скрипач(218 знак., 15.04.2019 14:10 - 14:34)
- Анонимность состояний Protothreads это не священная корова. Лечится, если нужно. Вопрос не в выборе между switch, goto или Protothreads. Переход через точку входа должен изменить состояние, иначе это не документируется (разве что вручную), а кроме Vit(204 знак., 15.04.2019 15:32)
- Есть состояние, а есть дуги переходов. Скрипач(501 знак., 15.04.2019 16:05 - 16:10)
- Я пользуюсь goto и не стесняюсь. Но goto, необходимые для алгоритма, а не для работы с анонимными состояниями, у меня обернуты - добавляется изменение переменной состояния. Я показал как при switch можно обеспечить переход на ТОЧКУ ВХОДА из Vit(1042 знак., 15.04.2019 17:08)
- Ничего не поделаешь, я ставил перед собой задачу подружить именно protothreads с проименованными состояниями. Скрипач(385 знак., 15.04.2019 21:03 - 21:06)
- Я пользуюсь goto и не стесняюсь. Но goto, необходимые для алгоритма, а не для работы с анонимными состояниями, у меня обернуты - добавляется изменение переменной состояния. Я показал как при switch можно обеспечить переход на ТОЧКУ ВХОДА из Vit(1042 знак., 15.04.2019 17:08)
- Есть состояние, а есть дуги переходов. Скрипач(501 знак., 15.04.2019 16:05 - 16:10)
- Вы наверно, в каком-то другом мире живете, где есть время на документирование ПО, остается только завидовать. - VLLV(15.04.2019 14:35)
- Да, в другом (хмуро). И на документирование ПО, и на журнал версий ПО, и на code review. - Скрипач(15.04.2019 14:45 - 14:52)
- Если уж коверкать слова, предлагаю не прототриды, а пуськи бятые. Ну и switch всего лишь потому, что в рамках стандартного Си только так и можно. GCC даёт расширение "labels as values", с ним гораздо эффективнее. - SciFi(15.04.2019 14:17 - 14:21)
- 1) Исправил 2) А вы готовы закладывать в архитектуру уникальную особенность одного единственного (хоть и мега-крутого) компилятора? Скрипач(57 знак., 15.04.2019 14:34)
- Целых два компилятора: GCC и Clang. - LightElf(Вчера, 12:40)
- Учитывая то, что компиляторов С всего лишь три (да и то, третий - sdcc - исключительно для микроконтроллеров), получаем абсолютное большинство. - Eddy_Em(Вчера, 14:03)
- А я и не закладываю. Просто GCC даёт ускоренный вариант, достаточно подсунуть компилятору в командную строку правильный define, в остальном всё можно оставить как везде. Кстати, таки protothreads. И никакой он не Дункан :-) - SciFi(15.04.2019 14:39, ссылка)
- А что со switch делать, если они в исходниках есть, а хотим прыгнуть на компилятор, который не умеет? Кроме того, это будет вторая (другая) переменная состояния, вы точно этого хотите? :) Скрипач(45 знак., 15.04.2019 14:43)
- А зачем "прыгать на компилятор", который это не умеет? Пытаться код
с STM32 на STM8 перенести (увы, под STM8 gcc не умеет, поэтому
приходится убогий sdcc использовать)? Eddy_Em(167 знак., Вчера, 14:06)
- Есть еще TCC и LCC, с которыми есть шансы столкнуться. - LightElf(Вчера, 14:09)
- Но зачем, когда есть gcc? Eddy_Em(70 знак., Вчера, 14:11)
- Есть еще TCC и LCC, с которыми есть шансы столкнуться. - LightElf(Вчера, 14:09)
- А зачем "прыгать на компилятор", который это не умеет? Пытаться код
с STM32 на STM8 перенести (увы, под STM8 gcc не умеет, поэтому
приходится убогий sdcc использовать)? Eddy_Em(167 знак., Вчера, 14:06)
- А что со switch делать, если они в исходниках есть, а хотим прыгнуть на компилятор, который не умеет? Кроме того, это будет вторая (другая) переменная состояния, вы точно этого хотите? :) Скрипач(45 знак., 15.04.2019 14:43)
- Целых два компилятора: GCC и Clang. - LightElf(Вчера, 12:40)
- 1) Исправил 2) А вы готовы закладывать в архитектуру уникальную особенность одного единственного (хоть и мега-крутого) компилятора? Скрипач(57 знак., 15.04.2019 14:34)
- Анонимность состояний Protothreads это не священная корова. Лечится, если нужно. Вопрос не в выборе между switch, goto или Protothreads. Переход через точку входа должен изменить состояние, иначе это не документируется (разве что вручную), а кроме Vit(204 знак., 15.04.2019 15:32)
- Именно что документировать. А не подменять документацию "осмысленными именами переменных". Вы правы в том смысле, что если уж пишем prototreads, то переход между состояниями КА неплохо бы сделать частью этой библиотеки. Скрипач(218 знак., 15.04.2019 14:10 - 14:34)
- Мой вариант самый лучший 😁😁😁 Бoмж(1140 знак., Вчера, 15:09)
- Мой вариант - намного лучше. Собственно состояния - прототридсы. goto это переход на мини блоки инициализации каждого из состояний. Скрипач(232 знак., 15.04.2019 12:20)
- офигеть, это всерьез? А то, что состояние - это не место в коде, а банальная переменная, которая выбирает место в коде - не рассматривается? т.е. массив функций по индексу - открытие? - VLLV(12.04.2019 16:04)
- Т.е. продолжаем прыгать, но не специально созданной для этого инструкцией, а каким-то через-оппным способом, нагородив кучу лишнего, загромождающего синтаксиса?! Скрипач(58 знак., 12.04.2019 16:43)
- Какой еще оопный способ в записи function[state]() ? А что касается читабельности, то 1) см ссылку 2) я сопровождаю старые проекты, написанные "в лоб", и новые, с использованием возможностей препроцессора, и могу сравнивать. На днях маханул шашкой VLLV(67 знак., 12.04.2019 16:51, ссылка)
- По сравнению с меткой? Две сущности вместо одной. Четыре строки текста вместо одной. Вызов функции не может быть именно в том месте где меняем состояние, нужен отдельно планировщик - еще несколько строк текста там, где они не нужны. Скрипач(117 знак., 12.04.2019 16:58)
- Планировщик - это одна строка "for (;;)". Но ладно, я сдаюсь, спишем неприятие GOTO на мою тупость ;) - VLLV(12.04.2019 18:14)
- На добивание. Скрипач(244 знак., 12.04.2019 18:38)
- Точно также! :) VLLV(341 знак., 12.04.2019 18:43)
- Параметры где? function[head.state](input1,output1,fault1,option1,option3) ? И на каждое состояние ОТДЕЛЬНАЯ функция? И на каждый тип агрегата отдельный тип массива функций? - Скрипач(12.04.2019 19:25 - 19:29)
- тут не просто один тип массива - просто один массив) Но это скорёе извращение, обычно на структуру агрегатора передается указатель. И параметров меньше нужно передавать. - VLLV(12.04.2019 20:19)
- Еще одна сущность.Ну и проверки типов, как я понимаю... придумали трусы? :) Скрипач(557 знак., 12.04.2019 20:25 - 20:37)
- Усё, здаюсь - VLLV(12.04.2019 20:34)
- Это зря. Со злом надо бороться) - s_h_e(13.04.2019 09:24)
- Усё, здаюсь - VLLV(12.04.2019 20:34)
- Еще одна сущность.Ну и проверки типов, как я понимаю... придумали трусы? :) Скрипач(557 знак., 12.04.2019 20:25 - 20:37)
- тут не просто один тип массива - просто один массив) Но это скорёе извращение, обычно на структуру агрегатора передается указатель. И параметров меньше нужно передавать. - VLLV(12.04.2019 20:19)
- Параметры где? function[head.state](input1,output1,fault1,option1,option3) ? И на каждое состояние ОТДЕЛЬНАЯ функция? И на каждый тип агрегата отдельный тип массива функций? - Скрипач(12.04.2019 19:25 - 19:29)
- Точно также! :) VLLV(341 знак., 12.04.2019 18:43)
- Не соглашусь с тобой, Гудвин(27 знак., 12.04.2019 18:18)
- Застал на липистрониксе срач на эту тему. Зажигал небезызвестный koyodza :-) - SciFi(12.04.2019 18:39)
- Не прижилось - думать надо - то ли (0), то ли (1) :) - VLLV(12.04.2019 18:29)
- На добивание. Скрипач(244 знак., 12.04.2019 18:38)
- Планировщик - это одна строка "for (;;)". Но ладно, я сдаюсь, спишем неприятие GOTO на мою тупость ;) - VLLV(12.04.2019 18:14)
- По сравнению с меткой? Две сущности вместо одной. Четыре строки текста вместо одной. Вызов функции не может быть именно в том месте где меняем состояние, нужен отдельно планировщик - еще несколько строк текста там, где они не нужны. Скрипач(117 знак., 12.04.2019 16:58)
- Какой еще оопный способ в записи function[state]() ? А что касается читабельности, то 1) см ссылку 2) я сопровождаю старые проекты, написанные "в лоб", и новые, с использованием возможностей препроцессора, и могу сравнивать. На днях маханул шашкой VLLV(67 знак., 12.04.2019 16:51, ссылка)
- дело скорей не в GOTO а в парадигме, если однозначно переносим отлаженный автомат в код, то можно и в GOTO и ассемблер, а если структурное программирование, то прыгать запрещено. - NAUT(12.04.2019 16:35)
- Т.е. продолжаем прыгать, но не специально созданной для этого инструкцией, а каким-то через-оппным способом, нагородив кучу лишнего, загромождающего синтаксиса?! Скрипач(58 знак., 12.04.2019 16:43)
- Гордий вертится в гробу... - SciFi(12.04.2019 15:18)
- Их сжыгали. Язычники, фуле... - mse homjak(12.04.2019 15:21)
- В начале рисуем классический switch, где перебираем все возможные
состояния. Ну, а после него - еще один switch, который вызывает
return для всех ненужных состояний, а все нужные пропускает - чтобы
перейти к "хвосту" функции, который выполняется для нескольких
возможных состояний. Eddy_Em(383 знак., Вчера, 09:33)
- Его не Мисрой звали? - SciFi(12.04.2019 15:04)
- ...и поэтому юзайте jmp-ы - NAUT(12.04.2019 14:53)
- Мой жизненный принцип: "...но не любой ценой". Скрипач(213 знак., 12.04.2019 14:54 - 15:09)
- Дикий трэш. Не в том месте скобочка, а в такой лапше ее легко пропустить - и "счастливой отладки!". - s_h_e(13.04.2019 09:17)
- Примерно с тех дней (даты исходного поста ветки), заприметил
прототреды Адама Дункелса. Было дело, даже заглянул под капот.
Впечатлился изяществом и, одновременно, кривизной решения. Задумал
когда-нибудь использовать. Nikolay_Po(1254 знак., 11.05.2025 16:55, ссылка)
- Следующая остановка - кооперативная многозадачность на основе
setjmp/longjmp. Я попробовал picoro - понравилось. Сделал небольшие
доработки для настройки размеров стеков задач и измерения
использованного стека. SciFi(1 знак., 11.05.2025 20:08, ссылка)
- Это если программа для одного программиста. Если в коллективе, предпочту ходовую ОСРВ. Посмотрим. Спасибо. - Nikolay_Po(11.05.2025 20:39)
- Ах если бы gcc-шные computed goto и label as value внесли в
стандарт - вообще песня была бы. - пpoxoдимeц(11.05.2025 19:38,
)
- Это ничего бы не дало. Потому что главный вопрос - сохранение
локальных переменных и повторный вход (yield). - Cкpипaч(11.05.2025 20:18)
- Фича "label as value" прекрасна и вне контекста protothreads - LightElf(Вчера, 14:10)
- ... но не перестаёт быть "запрещенным" goto. - Cкpипaч(Вчера, 14:46)
- Кто ж его
посадитзапретит, он же памятник? Не люблю глупого табуирования. В этом Дийкстра со мной согласен ;-) LightElf(300 знак., Вчера, 17:40)
- Кто ж его
- ... но не перестаёт быть "запрещенным" goto. - Cкpипaч(Вчера, 14:46)
- Фича "label as value" прекрасна и вне контекста protothreads - LightElf(Вчера, 14:10)
- Это ничего бы не дало. Потому что главный вопрос - сохранение
локальных переменных и повторный вход (yield). - Cкpипaч(11.05.2025 20:18)
- Это была славная словесная битва :) В принципе, я по прежнему, прикладной код пишу также как
тут обсосано - goto + Dunkels. Cкpипaч(106 знак., 11.05.2025 17:40)
- Обзавёлся "рабами" и перестал писать код. Личные проекты отвалились
по понятным причинам, но когда изредка просят подправить -
"читабельность идеальная, нравится - предельно просто" :) - VLLV(Вчера, 03:43)
- :) При моём подходе, оказывается есть еще одна вкусняшка:
exceptions. Проверки, вынесенные до PT_BEGIN, выполняются каждый
запуск, вне зависимости от текущего состояния автомата, и позволяют
по goto перейти в какое-то другое состояние, не загромождая текст
основной логики. - Cкpипaч(Вчера, 08:02)
- Не поведусь на вброс ;) - VLLV(Вчера, 08:36)
- +1 Очень полезная возможность, аналога которой в "обычной" ОСРВ я не знаю - AlexBi(Вчера, 08:11)
- :) При моём подходе, оказывается есть еще одна вкусняшка:
exceptions. Проверки, вынесенные до PT_BEGIN, выполняются каждый
запуск, вне зависимости от текущего состояния автомата, и позволяют
по goto перейти в какое-то другое состояние, не загромождая текст
основной логики. - Cкpипaч(Вчера, 08:02)
- Обзавёлся "рабами" и перестал писать код. Личные проекты отвалились
по понятным причинам, но когда изредка просят подправить -
"читабельность идеальная, нравится - предельно просто" :) - VLLV(Вчера, 03:43)
- Следующая остановка - кооперативная многозадачность на основе
setjmp/longjmp. Я попробовал picoro - понравилось. Сделал небольшие
доработки для настройки размеров стеков задач и измерения
использованного стека. SciFi(1 знак., 11.05.2025 20:08, ссылка)
- Надо уходить в таблицы т.к. закащщик и прочие физлица будет править таблицы а не код куячить. - NAUT(12.04.2019 15:14)
- Некоторые продвинутые пацаны в таких случаях делают простенький язык под задачу и интерпретатор к нему. DSL - domain-specific language. - SciFi(12.04.2019 15:20, ссылка)
- + 100500 Именно так (когда то) сварганил свою мнемонику интерпретатора: команда/параметр/выход по признаку [Yes|No|Esc-возврат на предыдущий уровень] на другую команду ;функцию; подпрограмму. Старо , как Мир, но очень действенно! Создал "матрицу" serhio(43 знак., 12.04.2019 16:44)
- +1. И графическую конфигурялку поверх DSL. - Скрипач(12.04.2019 15:23)
- знаем мы эти IAR вижуалстейты и модные фреймворки NAUT(56 знак., 12.04.2019 15:33)
- В любом случае, то что наваяют "часные лица" я бы хранил в виде сугубо текстовых констант, которые скармливал бы интерпретатору. - Скрипач(12.04.2019 15:39)
- видимо я что-то упускаю из вида, а примером не поделитесь хоть издали? не понимаю как Вы предлагаете проверять на непротиворечивость данных допустим, это же адская бизнес-логика какая-то должна быть с кучей правил - NAUT(12.04.2019 20:40)
- Я писал, у меня не дошли руки, реальной потребности нет, прикладной код пишут те же люди, что допущены к системному. Скрипач(769 знак., 12.04.2019 20:48 - 20:58)
- Препроцессор уже придуман, до нас - VLLV(12.04.2019 15:48)
- Ин-тер-при-та-тор. Потому что перезагрузка пользовательского кода не должна подразумевать перезагрузки системного. Неправильно это. - Скрипач(12.04.2019 15:50)
- А как же "не любой ценой"? :-) - SciFi(12.04.2019 15:59, ссылка)
- И? В чем вы видите "большую цену"? - Скрипач(12.04.2019 16:39)
- Большая цена - в попытках приобщить ТС к моде :-) - SciFi(12.04.2019 16:52, ссылка)
- Сформулируйте, пожалуйста, как-то иначе, каждое слово отдельно - понимаю, предложение целиком - нет. - Скрипач(12.04.2019 16:59)
- С трудом уговорили его на X Macro. Уговорить на интерпретатор - неподъёмная задача. - SciFi(12.04.2019 17:01)
- ну, вообще, на базе готового кода, если старшие коллеги советуют, то почему бы и нет... в голове пока не вижу "красоты" интерпретатора, максимум что понимаю, это типа парсера .CFG-файлов каких-нибудь, типа разделенного строками конфигурационного NAUT(932 знак., 12.04.2019 20:16)
- Может и поздно, но оставлю вам пару местных ссылок. - Dingo(18.04.2019 19:48, ссылка, ссылка)
- Он сам решит, как ему лучше. У меня тоже интерпретатор так и не появился. Точнее, он появился совсем в другом месте и совершенно другой роли. Скрипач(121 знак., 12.04.2019 17:06)
- ну, вообще, на базе готового кода, если старшие коллеги советуют, то почему бы и нет... в голове пока не вижу "красоты" интерпретатора, максимум что понимаю, это типа парсера .CFG-файлов каких-нибудь, типа разделенного строками конфигурационного NAUT(932 знак., 12.04.2019 20:16)
- С трудом уговорили его на X Macro. Уговорить на интерпретатор - неподъёмная задача. - SciFi(12.04.2019 17:01)
- Сформулируйте, пожалуйста, как-то иначе, каждое слово отдельно - понимаю, предложение целиком - нет. - Скрипач(12.04.2019 16:59)
- Большая цена - в попытках приобщить ТС к моде :-) - SciFi(12.04.2019 16:52, ссылка)
- И? В чем вы видите "большую цену"? - Скрипач(12.04.2019 16:39)
- Неправильно - это гоуту и множить сущности, программируя для Тини ;) Одна программа, один компилятор, один идеолог, все работает. - VLLV(12.04.2019 15:57)
- Ja-ja, natürlich... Ein Volk, ein Reich, ein Führer! ;О) И эта... Arbeit macht frei! Сцукко, тиньки - латентные авторитаристы. ;О) - mse homjak(13.04.2019 10:53)
- Ну не надо ТАК уж сгущать краски... ))) SERHIO(73 знак., 13.04.2019 01:51)
- Не увидел ничего интересного в этой статье. А пример автоматов с goto вообще жесть, массив функций имеет существенное преимущество - есть переменная "состояние", ее можно в интерфейсе посмотреть, ей можно присвоить тип енум и сразу понятен смысл. VLLV(282 знак., 13.04.2019 08:03)
- Переменная состояния - pt (см.мой пример, выше). Но она не читаема влоб. Это цена за использование прототридов. Скрипач(185 знак., 13.04.2019 11:19 - 11:24)
- А кто заставляет оформлять задержку как отдельное логическое состояние? Убогость goto? VLLV(1352 знак., 13.04.2019 14:14)
- Стоп! Не вижу в тексте. Как в пределах одного состояния проверить условие дать задержку и проверить другое условие? - Скрипач(13.04.2019 14:29)
- Например вот так. VLLV(959 знак., 13.04.2019 16:15)
- Т.е. отдельным состоянием. Так не интересно. - Скрипач(13.04.2019 16:48)
- Не разобрались, зацепившись за слово. Точно не интересно. - VLLV(13.04.2019 16:54)
- evOpOver. Я не прав? - Скрипач(13.04.2019 17:13)
- Это код события, соответствующего окончанию задержки. Разумеется, в системе есть фоновый таймер, отсчет задержек и формирование событий, эти механизмы универсальны для всех состояний, в которых используются, поэтому и вынесены. - VLLV(13.04.2019 17:35)
- А если таких отсчетов несколько, несколько событий и несколько разных case, верно? - Скрипач(13.04.2019 18:37)
- Верно, есть настраиваемые и есть фиксированные. - VLLV(13.04.2019 19:02)
- Ну и чего я тогда не понял? В моей предметной области это не удобно. Слишком много чисто технологических задержек. Дункелс рулит. - Скрипач(13.04.2019 21:04)
- То, что может быть неудобно, я принимаю, сам недавно обсуждал эту тему в команде, чтобы "система" не пожирала ресурсы. Но разговор ушел немного в сторону, от противостояния goto и переменной состояния типа такого: VLLV(854 знак., 13.04.2019 22:45)
- У меня переменная состояния использована под прототриды. Двухуровневая модель состояний - именованные и неименованные. Потому tradeoff между "формальной правильностью" и чистотой/ читабельностью кода. Скрипач(364 знак., 14.04.2019 06:23 - 06:29)
- Будем, только я пока не готов. VLLV(764 знак., 14.04.2019 08:29)
- Будуте готовы- маякните:) Скрипач(1271 знак., 14.04.2019 20:22 - 20:27)
- Будем, только я пока не готов. VLLV(764 знак., 14.04.2019 08:29)
- Неявное использование goto SERHIO(730 знак., 14.04.2019 00:23 - 00:54)
- У меня переменная состояния использована под прототриды. Двухуровневая модель состояний - именованные и неименованные. Потому tradeoff между "формальной правильностью" и чистотой/ читабельностью кода. Скрипач(364 знак., 14.04.2019 06:23 - 06:29)
- То, что может быть неудобно, я принимаю, сам недавно обсуждал эту тему в команде, чтобы "система" не пожирала ресурсы. Но разговор ушел немного в сторону, от противостояния goto и переменной состояния типа такого: VLLV(854 знак., 13.04.2019 22:45)
- Ну и чего я тогда не понял? В моей предметной области это не удобно. Слишком много чисто технологических задержек. Дункелс рулит. - Скрипач(13.04.2019 21:04)
- Верно, есть настраиваемые и есть фиксированные. - VLLV(13.04.2019 19:02)
- А если таких отсчетов несколько, несколько событий и несколько разных case, верно? - Скрипач(13.04.2019 18:37)
- Это код события, соответствующего окончанию задержки. Разумеется, в системе есть фоновый таймер, отсчет задержек и формирование событий, эти механизмы универсальны для всех состояний, в которых используются, поэтому и вынесены. - VLLV(13.04.2019 17:35)
- evOpOver. Я не прав? - Скрипач(13.04.2019 17:13)
- Не разобрались, зацепившись за слово. Точно не интересно. - VLLV(13.04.2019 16:54)
- Т.е. отдельным состоянием. Так не интересно. - Скрипач(13.04.2019 16:48)
- Например вот так. VLLV(959 знак., 13.04.2019 16:15)
- Стоп! Не вижу в тексте. Как в пределах одного состояния проверить условие дать задержку и проверить другое условие? - Скрипач(13.04.2019 14:29)
- А кто заставляет оформлять задержку как отдельное логическое состояние? Убогость goto? VLLV(1352 знак., 13.04.2019 14:14)
- Переменная состояния - pt (см.мой пример, выше). Но она не читаема влоб. Это цена за использование прототридов. Скрипач(185 знак., 13.04.2019 11:19 - 11:24)
- Не увидел ничего интересного в этой статье. А пример автоматов с goto вообще жесть, массив функций имеет существенное преимущество - есть переменная "состояние", ее можно в интерфейсе посмотреть, ей можно присвоить тип енум и сразу понятен смысл. VLLV(282 знак., 13.04.2019 08:03)
- Ткните пальцем в лишнюю сущность. ЛИШНЮЮ, которую выбросить, а не возможность добавить еще одну/две (массив функций, например). - Скрипач(12.04.2019 16:45)
- Прослоечка в виде интерпретатора не лишняя сущность, а встроенное средство языка - массив указателей - лишняя? нууу, осталось только #define TRUE FALSE - VLLV(12.04.2019 16:57)
- Передергиваете. Зачем? Скрипач(253 знак., 12.04.2019 17:03 - 17:08)
- :) - Молодой коллега(12.04.2019 19:11, youtube)
- goto != jmp, фоновые переходы - ну кто их считает? - VLLV(12.04.2019 18:32)
- Передергиваете. Зачем? Скрипач(253 знак., 12.04.2019 17:03 - 17:08)
- Прослоечка в виде интерпретатора не лишняя сущность, а встроенное средство языка - массив указателей - лишняя? нууу, осталось только #define TRUE FALSE - VLLV(12.04.2019 16:57)
- А как же "не любой ценой"? :-) - SciFi(12.04.2019 15:59, ссылка)
- Ин-тер-при-та-тор. Потому что перезагрузка пользовательского кода не должна подразумевать перезагрузки системного. Неправильно это. - Скрипач(12.04.2019 15:50)
- Вот-вот. Физлица правят, а потом фобос в грунт. - SciFi(12.04.2019 15:42)
- "в инструкции пользователя ввести следующую фразу: доступ разрешается только аттестованному персоналу" - NAUT(12.04.2019 15:44)
- Первое же "почему текст?" - потому что нужно обязательно предусматривать диагностику ошибок. И выдавать ее в понятной форме. - Скрипач(12.04.2019 15:48)
- ну, нет, мне проще из виндосформы тогда уж правильный текст сразу генерить по кликам мышки, чем проверять этот текст на всякоразно - NAUT(12.04.2019 16:18)
- я как то делал "транслятор" перед запуском его запускал сишный препроцессор. Препроцессор делал файл который я скармливал рукописному транслятору. транслятор генерил бинарник который клался во флэш. abivan(652 знак., 12.04.2019 17:37 - 17:42)
- И что будете делать если загрузится "какая-то лажа"? Жизнь, она такая, shit - happends. - Скрипач(12.04.2019 16:48)
- ну, нет, мне проще из виндосформы тогда уж правильный текст сразу генерить по кликам мышки, чем проверять этот текст на всякоразно - NAUT(12.04.2019 16:18)
- Первое же "почему текст?" - потому что нужно обязательно предусматривать диагностику ошибок. И выдавать ее в понятной форме. - Скрипач(12.04.2019 15:48)
- "в инструкции пользователя ввести следующую фразу: доступ разрешается только аттестованному персоналу" - NAUT(12.04.2019 15:44)
- видимо я что-то упускаю из вида, а примером не поделитесь хоть издали? не понимаю как Вы предлагаете проверять на непротиворечивость данных допустим, это же адская бизнес-логика какая-то должна быть с кучей правил - NAUT(12.04.2019 20:40)
- В любом случае, то что наваяют "часные лица" я бы хранил в виде сугубо текстовых констант, которые скармливал бы интерпретатору. - Скрипач(12.04.2019 15:39)
- знаем мы эти IAR вижуалстейты и модные фреймворки NAUT(56 знак., 12.04.2019 15:33)
- Некоторые продвинутые пацаны в таких случаях делают простенький язык под задачу и интерпретатор к нему. DSL - domain-specific language. - SciFi(12.04.2019 15:20, ссылка)
- Пример. Блин. Хотел поправить отступы, глюкнул редактор, удалился
текст. Вечером верну пример назад. Cкpипaч(2098 знак., 12.04.2019 14:40 - Вчера, 18:14)
- При определенных условиях, switch-case вырождается после компиляции как раз в таблицу функций и мой скромный опыт говорит о том, что switch case гораздо более читабелен, надежен и лучше поддерживается, чем таблица функций. Выносите содержимое Хитрый Китаец(61 знак., 15.04.2019 10:41)
- Да, уже лет десять назад IAR AVR формировал таблицу функций. А насчет читабельности switch - сильно зависит от размера case, если весь попадает на экран, то нет проблем. - VLLV(15.04.2019 13:46)
- Ну, один case - одна static функция и один break. Если совсем места жалко - 1 строка - Хитрый Китаец(17.04.2019 08:51)
- Да, уже лет десять назад IAR AVR формировал таблицу функций. А насчет читабельности switch - сильно зависит от размера case, если весь попадает на экран, то нет проблем. - VLLV(15.04.2019 13:46)
- Раз уж пошла такая "пьянка" об автоматах, то кто нибудь применял UML для описания графа конечного автомата с дальнейшей генерацией кода (или хотя бы "рыбы" кода). Если да, то можно сюда пример бросить? - Make_Pic(14.04.2019 15:01)
- Раз уж речь зашла о автоматах, может ли кто-нибудь пояснить смысл графических обозначений состояний в приложенном документе? Почему они разные? AlexG(46 знак., 14.04.2019 12:11)
- Не оно? - s_h_e(14.04.2019 12:57, ссылка)
- Спасибо! В части прямоугольников смысл чуть другой, но это именно оно. - AlexG(14.04.2019 15:10)
- да уж :( Make_Pic(14.04.2019 14:54)
- Старина Джордж Буль творил 1815-1864 - это не повод отказаться от конъюнкции и дизъюнкции. - Evgeny_CD(15.04.2019 20:05, ссылка)
- Не оно? - s_h_e(14.04.2019 12:57, ссылка)
- Это смутно мне напоминает то, как 35-40 лет назад делали формирователи импульсов на РЕ3 и РТ5. :-) - Лагунов(13.04.2019 17:27)
- В простых случаях примерно так AU08(597 знак., 12.04.2019 20:52)
- Тоже парился с многозадачками, от switch-case-ов не уйти, но можно их несколько штук последовательно сделать по флагам условий, код даже читабельнее становится. - Visitor(12.04.2019 18:44)
- Да вот можно уйти, видите, ниже коллега предложил реализацию табличного метода - NAUT(12.04.2019 20:26)
- "можно было бы в таблицу писать указатель на функцию которая проверяет сложное условие, но это некрасиво." Почему некрасиво ?? если еще сделать чтоб адрес в таблице являлся номером команды, вообще ничего парсить не надо, забрал адрес вызвал Aleksey_75(59 знак., 12.04.2019 15:32)
- "адрес в таблице являлся номером команды" - ээ я не понял - NAUT(12.04.2019 15:36)
- Ты на псевдокоде напиши чего хош, а то так непонятно. - =AlexD=(12.04.2019 14:19)
- Сейчас код для автомата такой: NAUT(595 знак., 12.04.2019 14:27)
- Поробуй такой Codavr(336 знак., 14.04.2019 02:41 - 03:01)
- Когда-то была NesOS - позиционировалась как FSMOS. Vit(91 знак., 13.04.2019 11:07)
- Возможно в Cpp11/14 можно задействовать безымянные лямбда, в сях такое не получится. - =AlexD=(12.04.2019 14:42)
- ИМХО, с макросами надо поколдовать. - SciFi(12.04.2019 14:40)
- ну дык нужен массив функций проверки условий, индекс этого массива и впихивается. VLLV(81 знак., 12.04.2019 14:36)
- если оборачивать в функции, то есть такое, но это звиздец: NAUT(726 знак., 12.04.2019 14:49)
- или альтернатива - все условия генерирут события, тогда все вырождается в двумерный массив функций [state][event] - VLLV(12.04.2019 14:42)
- вот да, осталось придумать ГДЕ в коде проверять эти условия если они как-то прописаны в таблице - NAUT(12.04.2019 14:45)
- В случае с событиями я делаю это перед вызовом функции по индексу состояния, тогда чужие для этого состояния события пролетают и обнуляются после. - VLLV(12.04.2019 15:06)
- это в смысле так как-то? NAUT(195 знак., 12.04.2019 15:19)
- У меня полно разных вариантов, даже не знаю, что предлагать :) Вот например макросы, размещающие результат проверки условий в биты слова. VLLV(1885 знак., 12.04.2019 15:44)
- а где такое подсмотрели, как называется механизм? биты выставленные по условиям потом разворачиваются в результат? - NAUT(12.04.2019 16:08)
- В этом проекте биты не разворачиваются, а используются внутри функций обработки состояния просто с помощью маски. Альтернативный вариант такой: VLLV(602 знак., 12.04.2019 16:44)
- гениально! хороший код! спасибо большое! - NAUT(12.04.2019 17:35)
- В этом проекте биты не разворачиваются, а используются внутри функций обработки состояния просто с помощью маски. Альтернативный вариант такой: VLLV(602 знак., 12.04.2019 16:44)
- вот-вот этого хотелось, спасибо, ща изобрету - NAUT(12.04.2019 16:00)
- Так-так, начинаем понимать, что такое X Macro? - SciFi(12.04.2019 16:04, ссылка, ссылка)
- а это оно и есть же, да? спасибо! - NAUT(12.04.2019 16:13, ссылка)
- Именно, только мозги должны слегка привыкнуть к таким абстракциям. - VLLV(12.04.2019 16:46)
- а это оно и есть же, да? спасибо! - NAUT(12.04.2019 16:13, ссылка)
- Так-так, начинаем понимать, что такое X Macro? - SciFi(12.04.2019 16:04, ссылка, ссылка)
- а где такое подсмотрели, как называется механизм? биты выставленные по условиям потом разворачиваются в результат? - NAUT(12.04.2019 16:08)
- У меня полно разных вариантов, даже не знаю, что предлагать :) Вот например макросы, размещающие результат проверки условий в биты слова. VLLV(1885 знак., 12.04.2019 15:44)
- это в смысле так как-то? NAUT(195 знак., 12.04.2019 15:19)
- В случае с событиями я делаю это перед вызовом функции по индексу состояния, тогда чужие для этого состояния события пролетают и обнуляются после. - VLLV(12.04.2019 15:06)
- вот да, осталось придумать ГДЕ в коде проверять эти условия если они как-то прописаны в таблице - NAUT(12.04.2019 14:45)
- Сейчас код для автомата такой: NAUT(595 знак., 12.04.2019 14:27)
- Это посмотреть: Пpocтo_зaшeл(1 знак., Сегодня, 17:05,