Перейти к содержанию
    

1.Разумеется не один и тот же.

2.Про "напрямую" это Вы сами придумали и неведомо что под этим подразумеваете.

 

Ну-ка, ну-ка... Флагами у вас автоматы информацию не передают, переменную состояния друг друга не трогают (для тех, кто замучен моделью OSI - не записывают) .

Так каким же святым духом они взаимодействуют?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну-ка, ну-ка... Флагами у вас автоматы информацию не передают, переменную состояния друг друга не трогают (для тех, кто замучен моделью OSI - не записывают) .

Так каким же святым духом они взаимодействуют?

Не передергивайте, я протестовал против придуманного Вами понятия " напрямую меняет" неведомо что для Вас означающего. Посему уже третий раз повторяю:

они взаимодействуют через изменения СОСТОЯНИЙ друг друга

Собственно процедура перехода из одного состояния в другое есть прерогатива автомата, который свое состояние меняет, а не того автомата, который это изменение инициирует.

При этом сама процедура изменения состояния хорошо выносится из общего контекста конечного автомата в отдельную процедуру изменения состояний, что тоже упрощает и читабельность и написание, и понимание и отладку, работы автомата. Другой автомат просто вызывает эту процедуру о которой собственно не знает ничего, кроме того, что она в результате своей работы и работы чужого конечного автомата установит его в затребованное состояние.

(для тех, кто замучен моделью OSI

Для тех, для кого в мире нет ничего, кроме нескольких моторчиков, ссылка на один (первый попавшийся) из нижних уровней - LAPВ :https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-X.25-199610-I!!PDF-E&type=items

В стандарт уже описан с терминах конечного автомата.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ссылка на один (первый попавшийся) из нижних уровней - 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

При этом сама процедура изменения состояния хорошо выносится из общего контекста конечного автомата в отдельную процедуру изменения состояний, что тоже упрощает и читабельность и написание, и понимание и отладку, работы автомата. Другой автомат просто вызывает эту процедуру о которой собственно не знает ничего, кроме того, что она в результате своей работы и работы чужого конечного автомата установит его в затребованное состояние.

Ну и...

А дальше в той процедурке взводите флаг. Пришли к тому с чего начали.

А если ваша процедурка прямо пишет в переменную состояния то я вас поздравляю, вы разорвали свою машину на куски и скоро это же произойдет с вашим мозгом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интересно что вы курите.

В этом стандарте нет ни одного! упоминания таких терминов как finite-state machine (FSM) или finite-state automaton (FSA), finite automaton, или просто state machine

Какой ужас! А то, что в нем разрисованы "state diagrams" и соответственно состояния конечного автомата переходы между состояниями, это уже не доступно пониманию чукчи-писателя :(.

А дальше в той процедурке взводите флаг. Пришли к тому с чего начали.

Это Вы у себя в голове, возможно чего-то взводите.

А если ваша процедурка прямо пишет в переменную состояния то я вас поздравляю, вы разорвали свою машину на куски и

Себя поздравьте с уже третьей безуспешной попыткой приписать свои глупости c какой то "прямой записью" мне.

скоро это же произойдет с вашим мозгом.

Я за свои 55 лет написал и сопровождаю, достаточно много конечных автоматов, причем и весьма сложных (не по тому, что они дурно написано, а по тому, что объекты сложные), а не для запустить остановить пару моторчиков. Так что методика программирования конечных автоматов у меня обработана. Мозг на месте. То, что Вам с бухты-барахты удалось даже для моторчика родить уродливый конечный автомат - верю. Конечные автоматы должны быть изначально спроектированы тщательно, после чего, как не удивительно :), достаточно легко пишутся и очень четко работают. Нежели же попытаться наскоком чего то там начать писать и латать рассматривая результат не работы под отладчиком, то лепя заплатки, ничего хорошего не получится.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Занимаюсь созданием приборов с микроконтроллерным управлением. Ничего эдакого, как говорит ЛИ "автоматизация курятников". Из последнего у меня получилось 32К на Си. Освоил и пользуюсь методами из теории конечных автоматов. Сообщения, таймеры много канальные программные.

Вау, 32К. Шутка ли! Это ж целая тыща строк! Сложно! </sarcasm>

Серьезно, однако, если вам это сложно надо учиться. Это не то что не сложно, это просто ни о чем. 1000 строк это на неделю работы.

В этой теме речь не идет о пром контроллерах, армах или скриптовых движках. Это наверное и важно и интересно, но точно не мне и не сейчас.

Из конструктива в теме отмечу ссылки на ооп и ос. На сколько мне известно, то это огромные темы с массой интересного. Однако напоминаю, что у меня маленькие процы и в принципе простые задачи сложно взаимодействующие друг с другом.

Что из самого ценного взять и трансформировать в мир маленьких камней из ооп и ос? обьекты и задачи? семафоры? есть ли реализации на которые можно смотреть и наследовать?

Не нужно вам на 8ми битнике ни OOП ни С++. То что вы описали, это примитивные программы с простейшей логикой. Если вы не можете это эффективно на С выразить, промочки вам будут только усложнять жизнь. С должно быть вполне достаточно. Универсальных советов тут быть не может. Может с опытом придет )) Может надо поработать с кем-то и поучиться

 

Почитал ваши посты дальше. В принципе, наверное, вы на правильном пути, раз уже сами пришли к тем же выводам.

Я бы посоветовал вам почитать "Clean code <...>" by Martin. Ничего такого, но много правильных советов по поводу того, как делать программу более понятной и читаемой. В остальном вам поможет только "опыт, сын ошибок трудных"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не нужно вам на 8ми битнике ни OOП ни С++. То что вы описали, это примитивные программы с простейшей логикой. Если вы не можете это эффективно на С выразить, промочки вам будут только усложнять жизнь. С должно быть вполне достаточно. Универсальных советов тут быть не может. Может с опытом придет )) Может надо поработать с кем-то и поучиться

Я нахожусь в соответствующем разделе и задаю вопросы не для того чтоб услышать что мол мало знаю! Это и так ясно, по-крайней мере для меня. Но справедливости ради тысяча строк это в моем проекте один "с" файл из 30ти! И это если не считать USB драйвера (LUFA библиотека. Там наверное как минимум дясять-15 тыс строк).

Таким образом, Вы "дыманули" ориентировочно на два порядка. Мне было бы стыдно за такие оценки и отношение к вопросу.

И снова оговорюсь: речь идет о сложности для меня, для вас это может быть и легко, но судя по всему с некоторыми исключениями :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Таким образом вы дыманули

 

Гы, ну так я же исхожу из того, что вы написали. Написали бы 30 тыщ чтобы не надо было додумывать. К слову, библиотеку-то вы не считайте. Она же для вас только black box.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гы, ну так я же исхожу из того, что вы написали. Написали бы 30 тыщ чтобы не надо было додумывать. К слову, библиотеку-то вы не считайте. Она же для вас только black box.

 

Вот я бы на Вашем месте извинился. Так принято поступать если ошибся. Посмотрим на что Вы годны :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык, комментарии и пустые строки тоже не считаются. А то можно в подобной фигне насчитать

cat *.c|wc -l
4220

 

P.S. А 1000 строк — это все-таки не неделя. Зависит от сложности. Я вот сегодня за 4 часа написал сотню строк. Теперь уже второй час сижу, не понимаю, чего оно сегфолтится (простая комповая утилитка с кучей malloc/free).

Изменено пользователем Эдди

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык, комментарии и пустые строки тоже не считаются. А то можно в подобной фигне насчитать

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
}

 

Если следить за этим, такое преобразование очень часто возможно.

Код получается более линейным и понятным

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сори, а зачем int TimeCountУ ? А зачем его определять ноликом? А зачем скобки в первом случае!? И мне кажется можно и нужно проще записать все это. Или я ошибаюсь!?

Изменено пользователем Herz
Избыточное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сори, а зачем int TimeCountУ ? А зачем его определять ноликом? А зачем скобки в первом случае!? И мне кажется можно и нужно проще записать все это. Или я ошибаюсь!?

На месте do some stuff подразумевается код, который исполняется раз в 10 вызовов. В первом случае скобки нужны чтобы этот код был внутри if.

 

Перепишите проще, даже интересно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В первом случае скобки нужны чтобы этот код был внутри if.

 

А зачем тогда точка с запятой нужна? Я плохо ориентируюсь в таких моментах.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Перепишите проще, даже интересно.

    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)) )

это тоже общая унифицированная часть и рожать на каждое использование таймера чего то заново неразумно :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А зачем тогда точка с запятой нужна? Я плохо ориентируюсь в таких моментах.

Подразумевается, что доходишь до команды return и если условие выполняется, то дальше код можно не смотреть

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...