|
|
  |
Сложные программы |
|
|
|
Jan 10 2017, 10:06
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AlexandrY @ Jan 10 2017, 11:23)  Ну-ка, ну-ка... Флагами у вас автоматы информацию не передают, переменную состояния друг друга не трогают (для тех, кто замучен моделью OSI - не записывают) . Так каким же святым духом они взаимодействуют? Не передергивайте, я протестовал против придуманного Вами понятия " напрямую меняет" неведомо что для Вас означающего. Посему уже третий раз повторяю: Цитата они взаимодействуют через изменения СОСТОЯНИЙ друг друга Собственно процедура перехода из одного состояния в другое есть прерогатива автомата, который свое состояние меняет, а не того автомата, который это изменение инициирует. При этом сама процедура изменения состояния хорошо выносится из общего контекста конечного автомата в отдельную процедуру изменения состояний, что тоже упрощает и читабельность и написание, и понимание и отладку, работы автомата. Другой автомат просто вызывает эту процедуру о которой собственно не знает ничего, кроме того, что она в результате своей работы и работы чужого конечного автомата установит его в затребованное состояние. Цитата (для тех, кто замучен моделью OSI Для тех, для кого в мире нет ничего, кроме нескольких моторчиков, ссылка на один (первый попавшийся) из нижних уровней - LAPВ :https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-X.25-199610-I!!PDF-E&type=items В стандарт уже описан с терминах конечного автомата.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 10 2017, 11:32
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(zltigo @ Jan 10 2017, 12:06)  ссылка на один (первый попавшийся) из нижних уровней - 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 @ Jan 10 2017, 12:06)  При этом сама процедура изменения состояния хорошо выносится из общего контекста конечного автомата в отдельную процедуру изменения состояний, что тоже упрощает и читабельность и написание, и понимание и отладку, работы автомата. Другой автомат просто вызывает эту процедуру о которой собственно не знает ничего, кроме того, что она в результате своей работы и работы чужого конечного автомата установит его в затребованное состояние. Ну и... А дальше в той процедурке взводите флаг. Пришли к тому с чего начали. А если ваша процедурка прямо пишет в переменную состояния то я вас поздравляю, вы разорвали свою машину на куски и скоро это же произойдет с вашим мозгом.
|
|
|
|
|
Jan 10 2017, 12:05
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AlexandrY @ Jan 10 2017, 13:32)  Интересно что вы курите. В этом стандарте нет ни одного! упоминания таких терминов как finite-state machine (FSM) или finite-state automaton (FSA), finite automaton, или просто state machine Какой ужас! А то, что в нем разрисованы "state diagrams" и соответственно состояния конечного автомата переходы между состояниями, это уже не доступно пониманию чукчи-писателя  . Цитата А дальше в той процедурке взводите флаг. Пришли к тому с чего начали. Это Вы у себя в голове, возможно чего-то взводите. Цитата А если ваша процедурка прямо пишет в переменную состояния то я вас поздравляю, вы разорвали свою машину на куски и Себя поздравьте с уже третьей безуспешной попыткой приписать свои глупости c какой то "прямой записью" мне. Цитата скоро это же произойдет с вашим мозгом. Я за свои 55 лет написал и сопровождаю, достаточно много конечных автоматов, причем и весьма сложных (не по тому, что они дурно написано, а по тому, что объекты сложные), а не для запустить остановить пару моторчиков. Так что методика программирования конечных автоматов у меня обработана. Мозг на месте. То, что Вам с бухты-барахты удалось даже для моторчика родить уродливый конечный автомат - верю. Конечные автоматы должны быть изначально спроектированы тщательно, после чего, как не удивительно  , достаточно легко пишутся и очень четко работают. Нежели же попытаться наскоком чего то там начать писать и латать рассматривая результат не работы под отладчиком, то лепя заплатки, ничего хорошего не получится.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 10 2017, 14:09
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(Буратино @ Jan 4 2017, 01:47)  Занимаюсь созданием приборов с микроконтроллерным управлением. Ничего эдакого, как говорит ЛИ "автоматизация курятников". Из последнего у меня получилось 32К на Си. Освоил и пользуюсь методами из теории конечных автоматов. Сообщения, таймеры много канальные программные. Вау, 32К. Шутка ли! Это ж целая тыща строк! Сложно! </sarcasm> Серьезно, однако, если вам это сложно надо учиться. Это не то что не сложно, это просто ни о чем. 1000 строк это на неделю работы. Цитата(Буратино @ Jan 4 2017, 14:11)  В этой теме речь не идет о пром контроллерах, армах или скриптовых движках. Это наверное и важно и интересно, но точно не мне и не сейчас. Из конструктива в теме отмечу ссылки на ооп и ос. На сколько мне известно, то это огромные темы с массой интересного. Однако напоминаю, что у меня маленькие процы и в принципе простые задачи сложно взаимодействующие друг с другом. Что из самого ценного взять и трансформировать в мир маленьких камней из ооп и ос? обьекты и задачи? семафоры? есть ли реализации на которые можно смотреть и наследовать? Не нужно вам на 8ми битнике ни OOП ни С++. То что вы описали, это примитивные программы с простейшей логикой. Если вы не можете это эффективно на С выразить, промочки вам будут только усложнять жизнь. С должно быть вполне достаточно. Универсальных советов тут быть не может. Может с опытом придет )) Может надо поработать с кем-то и поучиться Почитал ваши посты дальше. В принципе, наверное, вы на правильном пути, раз уже сами пришли к тем же выводам. Я бы посоветовал вам почитать "Clean code <...>" by Martin. Ничего такого, но много правильных советов по поводу того, как делать программу более понятной и читаемой. В остальном вам поможет только "опыт, сын ошибок трудных"
|
|
|
|
|
Jan 10 2017, 14:12
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Цитата(ar__systems @ Jan 10 2017, 16:51)  Не нужно вам на 8ми битнике ни OOП ни С++. То что вы описали, это примитивные программы с простейшей логикой. Если вы не можете это эффективно на С выразить, промочки вам будут только усложнять жизнь. С должно быть вполне достаточно. Универсальных советов тут быть не может. Может с опытом придет )) Может надо поработать с кем-то и поучиться Я нахожусь в соответствующем разделе и задаю вопросы не для того чтоб услышать что мол мало знаю! Это и так ясно, по-крайней мере для меня. Но справедливости ради тысяча строк это в моем проекте один "с" файл из 30ти! И это если не считать USB драйвера (LUFA библиотека. Там наверное как минимум дясять-15 тыс строк). Таким образом, Вы "дыманули" ориентировочно на два порядка. Мне было бы стыдно за такие оценки и отношение к вопросу. И снова оговорюсь: речь идет о сложности для меня, для вас это может быть и легко, но судя по всему с некоторыми исключениями
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Jan 10 2017, 14:34
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Дык, комментарии и пустые строки тоже не считаются. А то можно в подобной фигне насчитать Код cat *.c|wc -l 4220 ☺ P.S. А 1000 строк — это все-таки не неделя. Зависит от сложности. Я вот сегодня за 4 часа написал сотню строк. Теперь уже второй час сижу, не понимаю, чего оно сегфолтится (простая комповая утилитка с кучей malloc/free).
Сообщение отредактировал Эдди - Jan 10 2017, 14:38
|
|
|
|
|
Jan 10 2017, 15:27
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(Эдди @ Jan 10 2017, 09:34)  Дык, комментарии и пустые строки тоже не считаются. А то можно в подобной фигне насчитать Код 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 } Если следить за этим, такое преобразование очень часто возможно. Код получается более линейным и понятным
|
|
|
|
|
Jan 10 2017, 15:46
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(Буратино @ Jan 10 2017, 10:35)  Сори, а зачем int TimeCountУ ? А зачем его определять ноликом? А зачем скобки в первом случае!? И мне кажется можно и нужно проще записать все это. Или я ошибаюсь!? На месте do some stuff подразумевается код, который исполняется раз в 10 вызовов. В первом случае скобки нужны чтобы этот код был внутри if. Перепишите проще, даже интересно.
|
|
|
|
|
Jan 10 2017, 16:16
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(ar__systems @ Jan 10 2017, 17:46)  Перепишите проще, даже интересно. Код 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)) ) это тоже общая унифицированная часть и рожать на каждое использование таймера чего то заново неразумно
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 10 2017, 16:17
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 14-08-16
Пользователь №: 92 949

|
Цитата А зачем тогда точка с запятой нужна? Я плохо ориентируюсь в таких моментах. Подразумевается, что доходишь до команды return и если условие выполняется, то дальше код можно не смотреть
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|