Цитата(jcxz @ Jul 15 2016, 08:11)

Объединить? А что тогда мешает объединить все остальные состояния автомата в одно? Если ничего - то и автомат не нужен, так как всего одно состояние осталось. А если есть автомат - значит он для чего-то нужен и нельзя объединить состояния.
Почему это нельзя объединить? Ну не будьте уж таким догматиком. Одну и ту же задачу могут выполнять автомат с одной переменной состояния, которое может принимать, допустим 16 значений и фрагмент программы, использующий 16 битовых флагов. И выглядеть они будут похоже, всего вместо case будет if, ну и присвоение чуть по другому.
А между этими двумя реализациями целый диапазон возможных решений.
Цитата(jcxz @ Jul 15 2016, 08:11)

А если нужен дополнительный индекс, то как потом возвращаться к основному? А если не один уровень вложенности, а больше? Стек хранения состояний городить?
Усложняете. Вот кода, описывающего одно состояние с дополнительными промежуточными состояниями проверки индикации.
Код
void fSelfTest(void)
{ if (old_status-status)
{ StatusFirstTimeReady("Tst");
SET_TIMER(N500ms);
}
if (event==evTimer)
{ switch (status_var)
{ case 0: OnWorkRed1(); break;
case 1: OnChemLed(); break;
case 2: OnWaterLed(); break;
case 3: ToggleWorkColor(); OffChemWaterLeds();
case 4: status= sWaiting; break;
default: status_var=-1;
}
status_var++;
}
}
Что касается стека... Стек, не стек, но что мешает запоминать предыдущее состояние и при необходимости туда возвращаться? Если интерфейс пользователя - один большой автомат, некоторые функции вызываются из разных меню, возвращаться нужно именно в предыдущее состояние. Можно назвать это одноуровневым стеком.