AlexandrY 3 10 января, 2017 Опубликовано 10 января, 2017 · Жалоба 1.Разумеется не один и тот же. 2.Про "напрямую" это Вы сами придумали и неведомо что под этим подразумеваете. Ну-ка, ну-ка... Флагами у вас автоматы информацию не передают, переменную состояния друг друга не трогают (для тех, кто замучен моделью OSI - не записывают) . Так каким же святым духом они взаимодействуют? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 10 января, 2017 Опубликовано 10 января, 2017 · Жалоба Ну-ка, ну-ка... Флагами у вас автоматы информацию не передают, переменную состояния друг друга не трогают (для тех, кто замучен моделью OSI - не записывают) . Так каким же святым духом они взаимодействуют? Не передергивайте, я протестовал против придуманного Вами понятия " напрямую меняет" неведомо что для Вас означающего. Посему уже третий раз повторяю: они взаимодействуют через изменения СОСТОЯНИЙ друг друга Собственно процедура перехода из одного состояния в другое есть прерогатива автомата, который свое состояние меняет, а не того автомата, который это изменение инициирует. При этом сама процедура изменения состояния хорошо выносится из общего контекста конечного автомата в отдельную процедуру изменения состояний, что тоже упрощает и читабельность и написание, и понимание и отладку, работы автомата. Другой автомат просто вызывает эту процедуру о которой собственно не знает ничего, кроме того, что она в результате своей работы и работы чужого конечного автомата установит его в затребованное состояние. (для тех, кто замучен моделью OSI Для тех, для кого в мире нет ничего, кроме нескольких моторчиков, ссылка на один (первый попавшийся) из нижних уровней - LAPВ :https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-X.25-199610-I!!PDF-E&type=items В стандарт уже описан с терминах конечного автомата. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 10 января, 2017 Опубликовано 10 января, 2017 · Жалоба ссылка на один (первый попавшийся) из нижних уровней - LAPВ :https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-X.25-199610-I!!PDF-E&type=items В стандарт уже описан с терминах конечного автомата. Интересно что вы курите. В этом стандарте нет ни одного! упоминания таких терминов как finite-state machine (FSM) или finite-state automaton (FSA), finite automaton, или просто state machine При этом сама процедура изменения состояния хорошо выносится из общего контекста конечного автомата в отдельную процедуру изменения состояний, что тоже упрощает и читабельность и написание, и понимание и отладку, работы автомата. Другой автомат просто вызывает эту процедуру о которой собственно не знает ничего, кроме того, что она в результате своей работы и работы чужого конечного автомата установит его в затребованное состояние. Ну и... А дальше в той процедурке взводите флаг. Пришли к тому с чего начали. А если ваша процедурка прямо пишет в переменную состояния то я вас поздравляю, вы разорвали свою машину на куски и скоро это же произойдет с вашим мозгом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 10 января, 2017 Опубликовано 10 января, 2017 · Жалоба Интересно что вы курите. В этом стандарте нет ни одного! упоминания таких терминов как finite-state machine (FSM) или finite-state automaton (FSA), finite automaton, или просто state machine Какой ужас! А то, что в нем разрисованы "state diagrams" и соответственно состояния конечного автомата переходы между состояниями, это уже не доступно пониманию чукчи-писателя :(. А дальше в той процедурке взводите флаг. Пришли к тому с чего начали. Это Вы у себя в голове, возможно чего-то взводите. А если ваша процедурка прямо пишет в переменную состояния то я вас поздравляю, вы разорвали свою машину на куски и Себя поздравьте с уже третьей безуспешной попыткой приписать свои глупости c какой то "прямой записью" мне. скоро это же произойдет с вашим мозгом. Я за свои 55 лет написал и сопровождаю, достаточно много конечных автоматов, причем и весьма сложных (не по тому, что они дурно написано, а по тому, что объекты сложные), а не для запустить остановить пару моторчиков. Так что методика программирования конечных автоматов у меня обработана. Мозг на месте. То, что Вам с бухты-барахты удалось даже для моторчика родить уродливый конечный автомат - верю. Конечные автоматы должны быть изначально спроектированы тщательно, после чего, как не удивительно :), достаточно легко пишутся и очень четко работают. Нежели же попытаться наскоком чего то там начать писать и латать рассматривая результат не работы под отладчиком, то лепя заплатки, ничего хорошего не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavka012 0 10 января, 2017 Опубликовано 10 января, 2017 · Жалоба Занимаюсь созданием приборов с микроконтроллерным управлением. Ничего эдакого, как говорит ЛИ "автоматизация курятников". Из последнего у меня получилось 32К на Си. Освоил и пользуюсь методами из теории конечных автоматов. Сообщения, таймеры много канальные программные. Вау, 32К. Шутка ли! Это ж целая тыща строк! Сложно! </sarcasm> Серьезно, однако, если вам это сложно надо учиться. Это не то что не сложно, это просто ни о чем. 1000 строк это на неделю работы. В этой теме речь не идет о пром контроллерах, армах или скриптовых движках. Это наверное и важно и интересно, но точно не мне и не сейчас. Из конструктива в теме отмечу ссылки на ооп и ос. На сколько мне известно, то это огромные темы с массой интересного. Однако напоминаю, что у меня маленькие процы и в принципе простые задачи сложно взаимодействующие друг с другом. Что из самого ценного взять и трансформировать в мир маленьких камней из ооп и ос? обьекты и задачи? семафоры? есть ли реализации на которые можно смотреть и наследовать? Не нужно вам на 8ми битнике ни OOП ни С++. То что вы описали, это примитивные программы с простейшей логикой. Если вы не можете это эффективно на С выразить, промочки вам будут только усложнять жизнь. С должно быть вполне достаточно. Универсальных советов тут быть не может. Может с опытом придет )) Может надо поработать с кем-то и поучиться Почитал ваши посты дальше. В принципе, наверное, вы на правильном пути, раз уже сами пришли к тем же выводам. Я бы посоветовал вам почитать "Clean code <...>" by Martin. Ничего такого, но много правильных советов по поводу того, как делать программу более понятной и читаемой. В остальном вам поможет только "опыт, сын ошибок трудных" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 10 января, 2017 Опубликовано 10 января, 2017 · Жалоба Не нужно вам на 8ми битнике ни OOП ни С++. То что вы описали, это примитивные программы с простейшей логикой. Если вы не можете это эффективно на С выразить, промочки вам будут только усложнять жизнь. С должно быть вполне достаточно. Универсальных советов тут быть не может. Может с опытом придет )) Может надо поработать с кем-то и поучиться Я нахожусь в соответствующем разделе и задаю вопросы не для того чтоб услышать что мол мало знаю! Это и так ясно, по-крайней мере для меня. Но справедливости ради тысяча строк это в моем проекте один "с" файл из 30ти! И это если не считать USB драйвера (LUFA библиотека. Там наверное как минимум дясять-15 тыс строк). Таким образом, Вы "дыманули" ориентировочно на два порядка. Мне было бы стыдно за такие оценки и отношение к вопросу. И снова оговорюсь: речь идет о сложности для меня, для вас это может быть и легко, но судя по всему с некоторыми исключениями :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavka012 0 10 января, 2017 Опубликовано 10 января, 2017 · Жалоба Таким образом вы дыманули Гы, ну так я же исхожу из того, что вы написали. Написали бы 30 тыщ чтобы не надо было додумывать. К слову, библиотеку-то вы не считайте. Она же для вас только black box. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 10 января, 2017 Опубликовано 10 января, 2017 · Жалоба Гы, ну так я же исхожу из того, что вы написали. Написали бы 30 тыщ чтобы не надо было додумывать. К слову, библиотеку-то вы не считайте. Она же для вас только black box. Вот я бы на Вашем месте извинился. Так принято поступать если ошибся. Посмотрим на что Вы годны :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 2 10 января, 2017 Опубликовано 10 января, 2017 (изменено) · Жалоба Дык, комментарии и пустые строки тоже не считаются. А то можно в подобной фигне насчитать cat *.c|wc -l 4220 ☺ P.S. А 1000 строк — это все-таки не неделя. Зависит от сложности. Я вот сегодня за 4 часа написал сотню строк. Теперь уже второй час сижу, не понимаю, чего оно сегфолтится (простая комповая утилитка с кучей malloc/free). Изменено 10 января, 2017 пользователем Эдди Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavka012 0 10 января, 2017 Опубликовано 10 января, 2017 · Жалоба Дык, комментарии и пустые строки тоже не считаются. А то можно в подобной фигне насчитать cat *.c|wc -l 4220 ☺ P.S. А 1000 строк — это все-таки не неделя. Зависит от сложности. Я вот сегодня за 4 часа написал сотню строк. Теперь уже второй час сижу, не понимаю, чего оно сегфолтится (простая комповая утилитка с кучей malloc/free). Комменты как раз считаются. Это важная часть программы. Раз на раз не приходится, и да, зависит от сложности. У меня за последние две недели вышло по тыще за неделю, и это я еще и другой работой занимался ). Буратино, у меня ошибки не было. Anyway, из моих личных советов я советую разбивать программу на функции, до такого размера, чтобы было за 30 секунд понятен весь ее код. И насколько возможно переписывать код с целью уменьшения глубины вложенности управляющих блоков. Пример: сравните варианты: void ProcessOnTime() { static int TimeCount = 0; TimeCount++; if ( TimeCount == 10 ) { TimeCount = 0; // Do some stuff here }; } // vs. void ProcessOnTime() { static int TimeCount = 0; TimeCount++; if ( TimeCount < 10 ) return; TimeCount = 0; // Do some stuff here } Если следить за этим, такое преобразование очень часто возможно. Код получается более линейным и понятным Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 10 января, 2017 Опубликовано 10 января, 2017 (изменено) · Жалоба Сори, а зачем int TimeCountУ ? А зачем его определять ноликом? А зачем скобки в первом случае!? И мне кажется можно и нужно проще записать все это. Или я ошибаюсь!? Изменено 10 января, 2017 пользователем Herz Избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavka012 0 10 января, 2017 Опубликовано 10 января, 2017 · Жалоба Сори, а зачем int TimeCountУ ? А зачем его определять ноликом? А зачем скобки в первом случае!? И мне кажется можно и нужно проще записать все это. Или я ошибаюсь!? На месте do some stuff подразумевается код, который исполняется раз в 10 вызовов. В первом случае скобки нужны чтобы этот код был внутри if. Перепишите проще, даже интересно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 10 января, 2017 Опубликовано 10 января, 2017 · Жалоба В первом случае скобки нужны чтобы этот код был внутри if. А зачем тогда точка с запятой нужна? Я плохо ориентируюсь в таких моментах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 10 января, 2017 Опубликовано 10 января, 2017 · Жалоба Перепишите проще, даже интересно. if( chk_timer_restart( &ledx_timer ) ) { // Do some stuff here } Это я к тому, что разнообразные функции таймеров: void set_timer( sys_timer_s *tim, ulong value ); void stp_timer( sys_timer_s *tim ); void rst_timer( sys_timer_s *tim ); bint chk_timer( sys_timer_s *tim ); bint chk_timer_stop( sys_timer_s *tim ); bint chk_timer_restart( sys_timer_s *tim ); void chg_timer( sys_timer_s *tim, ulong value ); #define set_timer_ms( t, v ) set_timer( (t), ((v)*( (SYS_FREQUENCY)/1000UL)) ) #define set_timer_ts( t, v ) set_timer( (t), ((v)*((2)*(SYS_FREQUENCY)/1000UL)) ) это тоже общая унифицированная часть и рожать на каждое использование таймера чего то заново неразумно :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dm37 0 10 января, 2017 Опубликовано 10 января, 2017 · Жалоба А зачем тогда точка с запятой нужна? Я плохо ориентируюсь в таких моментах. Подразумевается, что доходишь до команды return и если условие выполняется, то дальше код можно не смотреть Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться