Не, на таком уровне я нифига не понимаю… Нет этих лямбд в доступном описании.
Так КА тоже в доступном описании не наблюдаю. Сплошная кастрация и ЛГБТ.
Тем, что не работает. А так - ничего, симпатичный.
Может у Вас процессоры не той системе. Вроде залил и получилось.
Думаю, что это у Вас. На любом процессоре “той системы”, он не останавливается (как положено автомату) в конечном состоянии, а бесконечно херачит в монитор слово End
.
А Вам в голову не приходит что так было задумано. Там еще delay() стоит.
Просто такой вариант менее поучительный.
uint32_t T1 = 100, T2 = 200, T3 = 300;
int i = 0;
void (*events)() = {};
int state;
uint32_t past;
void go(int s) {
state = s;
past = millis();
switch (s) {
case 1:
i = 0;
events = {[]() {
if (millis() - past >= T1) {
Serial.println("Do 1");
past = millis();
i++; if (i > 3) go(2);
}
}
};
break;
case 2:
i = 0;
events = {[]() {
if (millis() - past >= T2) {
Serial.println("Do 2");
past = millis();
i++; if (i > 3) go(3);
}
}
};
break;
case 3:
i = 0;
events = {[]() {
if (millis() - past >= T3) {
Serial.println("Do 3");
past = millis();
i++; if (i > 3) go(0);
}
}
};
break;
default:
Serial.println("End");
events = {[]() {
}
};
break;
}
}
void setup() {
Serial.begin(9600);
go(1);
}
void loop() {
events();
}
понять бы еще что это значит ;(
[quote=“Alexey_Rem, post:113, topic:12726”]
понять бы еще что это значит ;(
[/quote] Понимаю, санкции Гугл закрыли
https://ravesli.com/lyambda-vyrazheniya-anonimnye-funktsii-v-s/
Или еще проще. Менять в loop функции, чем самым экономить процессорное время. Альтернатива if и swith.
Нет, Вы знаете, не приходит. Если бы так было задумано, то это не было бы конечным автоматом, по определению (хотя, для Вас и компилятор - конечный автомат )
спасибо
Если у системы есть разные этапы, а так же у каждого этапа могут вызываться различные события(ивенты), то это и есть КА. Или Вы считаете что если работа Конечного Автомата заканчивается END(остановка), то это не КА. Дискриминация это.
Проще говоря, если можно нарисовать граф КА то это КА. Если нет, то скорее всего это невозможно реализовать на компьютере.
полегчало?
Понятно
Это был “пухомат”
Вам - можно.
дублированием кода
Теперь это надо переделать в тип if(event()){status();}, отделив события по таймеру от состояний-действий1,2,3.
Так пишите без дублирования. Я привел только принцип.
Метку можно ставить везде. Ошибка будет вылазить только в одном случае, если метка будет стоять перед закрывающей скобкой. В этом случае после двоеточия метки надо поставить точку с запятой и ошибки компиляции не будет
L1:;
}
Вот так.
Ну, я был не совсем прав, ее заменили на POPAD в 32х разрядной системе команд. В 16-ти разрядной POPA осталася.
Так было в Си. В С++ есть нюансы. Формально-то типа можно, но поведение не определено. Компилятор, кстати, предупреждает.
Вот, смотрите:
void setup() {
Serial.begin(9600);
if (analogRead(1)) goto mumu;
int kaka = analogRead(2);
mumu:
Serial.println(kaka);
}
void loop() {}
+++++++++++++++++++++++++++++++++++++++
D:\GoogleD\Soft\Kaka\kaka2\kaka2.ino: In function 'void setup()':
D:\GoogleD\Soft\Kaka\kaka2\kaka2.ino:5:3: warning: jump to label 'mumu' [-fpermissive]
mumu:
^~~~
D:\GoogleD\Soft\Kaka\kaka2\kaka2.ino:3:27: note: from here
if (analogRead(1)) goto mumu;
^~~~
D:\GoogleD\Soft\Kaka\kaka2\kaka2.ino:4:7: note: crosses initialization of 'int kaka'
int kaka = analogRead(2);
^~~~
C:\Users\Eugene\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino\main.cpp: In function 'main':
C:\Users\Eugene\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino\Print.cpp:97:23: warning: 'kaka' may be used uninitialized in this function [-Wmaybe-uninitialized]
return printNumber(n, 10);
^
D:\GoogleD\Soft\Kaka\kaka2\kaka2.ino:4:7: note: 'kaka' was declared here
int kaka = analogRead(2);
^
Скетч использует 1782 байт (5%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 188 байт (9%) динамической памяти, оставляя 1860 байт для локальных переменных. Максимум: 2048 байт.
Зачем?