Конечные автоматы - для "школьников". Есть такое?

Так зачем в сетапе и лупе использовать метки с одинаковым названием? Ну это как то даже не логично. Компилятор ведь тоже ругается если вы дважды обьявите переменную.

Это мне? А где у меня одинаковые метки? У меня там всего одна метка на всю программу, а loop просто пустой - нету в нём меток. Или это кому-то другому было?

Компилятор говорит о другом: возможна ситуация, когда начнет использоваться необъявленная переменная. Объявлять ее нужно до использования оператора перехода.

Ну… чтобы разделить в пространстве текста скетча события и состояния.

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
int i = 0;
for_:
  if (i < 20) {
    i++; 
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    delay(500);
    goto for_;
  }
}
void loop() {
}
//блинк с goto
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}
void loop() {
goto function_1; end_1:
goto function_2; end_2:
  return;
function_1:
  digitalWrite(LED_BUILTIN, HIGH); delay(500);
  goto end_1;
function_2:
  digitalWrite(LED_BUILTIN, LOW); delay(500);
  goto end_2;
}

Да виноват недосмотрел.
Но у вас получается, что компилятор прыгает на не обьявлннную переменную. по этому и ругань идёт.
вот так ни какой ругани нет.


void setup() {
 int kaka;
  Serial.begin(9600);
  if (analogRead(1)) goto mumu;
  kaka = analogRead(2);
  mumu:
  Serial.println(kaka);
}

void loop() {}

Чтобы не было разночтений назовём пример - конченый автомат.

 int T1=1000,T2=2000,T3=3000;
  long Y=0;//переменная хранения моментов времени
  int i=0;//счётчик
  byte loop_=1;//счётчик последовательности delay();
  void setup(){
  }
  void loop(){
  if(event_()){status_();}
  }
//
  bool event_(){
 if(loop_==1&&millis()-Y>T1){
  Y=millis();
   i++;if(i>10){i=0;loop_++;}
   return true;
  }
  if(loop_==2&&millis()-Y>T2){
  Y=millis();
   i++;if(i>20){i=0;loop_++;}
   return true;
  }
  if(loop_==3&&millis()-Y>T3){
  Y=millis();
 i++;if(i>30){i=0;loop_=1;}
 return true;
  }
  return false;
  }
//
void status_(){
if(loop_==1){
//действие №1 
}
if(loop_==2){
//действие №2 
}  
if(loop_==3){
//действие №3
}    
}

Вот своеобразный взгляд некоего Архата с форума Гайвера. Немного расплывчато, но по детски понятное.

эх батенька, вы многое пропустили.

Читал мельком, но мало акцентов на конкретику, даже на примерах игрушек. Типа:


Нет описания структуры скетча применительно к КА.

То, что там написано, в принципе не является конечным автоматом (отсюда и такая запутанность) - программы КА простые как валенок, многие их вообще пишут одну на все случаи, потом только таблицу меняют. Я такой пример здесь приводил. Например, если это конечный автомат, то что там делают постоянные сравнения с millis? Это не автоматная программа, так что сколько её не полируй, автоматной она не станет.

Это именно тот случай, про который я возразил на Ваше утверждение, что

Как видим, не везде.

Лучше не надо, это, в лучшем случае, “пухомат”.

И где Вы таких находите? :slight_smile:

1 лайк

Ну хотя бы раз она должна быть в программе, иначе чем считать промежутки времени в “автомате” ?

Да сразу по запросу - конечные автоматы Ардуино.

Ничем. У него (автомата) нет часов. Также у него не памяти, чтобы хранить старое значение millis. Если Вы, конечно, имеете в виду конечный автомат, а не “пухомат”, который Пух активно рекламирует.

Истечение временного интервала для автомата точно такой же внешний сигнал (символ входного алфавита) как и любой другой (нажатие кнопки, например).

2 лайка

Хотя да, время отсутствует в описании совсем. Значит не автомат. Автомат значит - выходное отражение объекта в зеркале, зависящее от объекта входного и кривизны самого зеркала (коробка автомата).

Тогда только двоичный счётчик нажатий кнопки.


Либо думать над: