C++状态机的概念
本文向我们介绍了 C++ 状态机的概念,说明了如何使用它,并强调了它的优点。
C++ 状态机概述
要理解C++中的状态机,我们首先应该了解有限状态机的概念。
有限状态机是一种计算数学模型,它体现了这样的思想:计算机可以在任何指定时间处于有限数量的状态之一,并且可以随着时间的推移在这些状态之间变化。
状态机由状态、转换和动作组成。 状态是 FSM 可能处于的不同条件。转换是导致从一种状态变为另一种状态的操作。
当 FSM 从一种状态更改为另一种状态时,就会发生这些操作。 C++ 语言有三个定义状态机的关键字:enum、switch 和 goto。
枚举定义了一组表示 FSM 中每个可能状态的常量。 switch 语句检查哪个状态处于活动状态并执行适当的操作。
Goto 用于跳出嵌套循环或 switch 语句,而不中断或返回语句。
状态机的好处
下面列出了一些好处:
- 状态机提供了一种通过简单的转换规则来表达复杂行为的优雅方式。
- 它们非常适合对现实世界系统的特定方面进行建模,例如交通灯、电梯甚至人类语言。
- 状态机将设计解构为状态机术语中的一系列步骤或状态。 每个州负责特定的任务。
- 相反,事件是导致状态机在状态之间移动或转换的刺激。
C++ 中的状态转换
C++状态机代码中的状态转换是程序状态从一种状态变为另一种状态的过程。 事件或条件可以触发称为触发器的状态变化。
当状态发生变化时,可以执行一些操作,例如打印消息或更改屏幕上对象的颜色。
例如,如果长时间没有事件,然后发生事件,则会触发从等待到默认的转换。 C++ 编程语言提供了一种使用 switch 语句实现状态机的简单方法。
C++ 中的状态机类
构建状态机时,您需要两个基类:StateMachine 和 EventData。 从 StateMachine 派生一个类来获取支持状态更改和事件处理所需的组件。
StateMachine 头文件还包含几个预处理器多行宏来帮助实现状态机。 该结构需要是 EventData 基类的继承者,才能为状态函数提供唯一的数据。
我们可以在文件state_machine.cpp和demo.h中找到状态机的源代码。
state_machine.cpp 的示例代码:
#include "demo.h"
#include <iostream>
using namespace std;
void
Execute_State_Machine(void)
{
int 1st_state = 0;
while (1){
char trans_letter;
cout << "1st state: " << 1st_state << "\n";
cout << "Enter trans letter: ";
cin >> trans_letter;
cin.ignore(100, '\n');
demo_Entry const * bn = demo_begin();
demo_Entry const * const p_demo_end = demo_end();
bool demo_um = false;
while ((!demo_um) && (bn != p_demo_end))
{
if (bn->1st_state_id == 1st_state)
{
if (bn->trans_letter == trans_letter)
{
cout << "changing"
<< " from 1st " << 1st_state
<< ", to 2nd " << bn->pro_state_id
<< "\n";
1st_state = bn->pro_state_id;
demo_um = true;
break;
}
}
++bn;
}
if (!demo_um)
{
cerr << "same\n";
}
}
}
demo.h 的示例代码:
struct demo_x
{
int 1st_state_id;
char trans_letter;
int 2nd_state_id;
};
demo_x const * demo_begin(void);
demo_x const * demo_end(void);
demo.cpp 的示例代码:
#include "demo.h"
static const demo_x demo_m[] =
{
{ 0, 'T', 1},
{ 0, 'U', 2},
{ 0, 'V', 3},
};
static const int demo =
sizeof(demo_m) / sizeof(demo_m[0]);
Table_Entry const *
table_begin(void)
{
return &demo_m[0];
}
Table_Entry const *
table_end(void)
{
return &demo_m[demo];
}
相关文章
Arduino 复位
发布时间:2024/03/13 浏览次数:315 分类:C++
-
可以通过使用复位按钮,Softwarereset 库和 Adafruit SleepyDog 库来复位 Arduino。
Arduino 的字符转换为整型
发布时间:2024/03/13 浏览次数:181 分类:C++
-
可以使用简单的方法 toInt()函数和 Serial.parseInt()函数将 char 转换为 int。
Arduino 串口打印多个变量
发布时间:2024/03/13 浏览次数:381 分类:C++
-
可以使用 Serial.print()和 Serial.println()函数在串口监视器上显示变量值。