gpt4 book ai didi

state-machine - 用于状态机

转载 作者:行者123 更新时间:2023-12-03 05:33:23 24 4
gpt4 key购买 nike

我会在哪些编程领域使用状态机?为什么 ?我怎样才能实现一个?

编辑:如果要求不过分,请提供一个实际示例。

最佳答案

我会在哪些编程领域使用状态机?

使用状态机来表示一个(真实的或逻辑的)对象,该对象可以存在于有限数量的条件(“状态”)中,并根据固定的集合从一种状态进展到下一种状态规则。

为什么要使用状态机?

状态机通常是一种非常紧凑的方式来表示一组复杂的规则和条件,并处理各种输入。您将在内存有限的嵌入式设备中看到状态机。如果实现得当,状态机是自记录的,因为每个逻辑状态都代表一种物理条件。与程序等价物相比,状态机可以用极少的代码来实现,并且运行效率极高。此外,管理状态更改的规则通常可以作为数据存储在表中,提供易于维护的紧凑表示。

如何实现?

简单的例子:

enum states {      // Define the states in the state machine.
NO_PIZZA, // Exit state machine.
COUNT_PEOPLE, // Ask user for # of people.
COUNT_SLICES, // Ask user for # slices.
SERVE_PIZZA, // Validate and serve.
EAT_PIZZA // Task is complete.
} STATE;

STATE state = COUNT_PEOPLE;
int nPeople, nSlices, nSlicesPerPerson;

// Serve slices of pizza to people, so that each person gets
/// the same number of slices.
while (state != NO_PIZZA) {
switch (state) {
case COUNT_PEOPLE:
if (promptForPeople(&nPeople)) // If input is valid..
state = COUNT_SLICES; // .. go to next state..
break; // .. else remain in this state.
case COUNT_SLICES:
if (promptForSlices(&nSlices))
state = SERVE_PIZZA;
break;
case SERVE_PIZZA:
if (nSlices % nPeople != 0) // Can't divide the pizza evenly.
{
getMorePizzaOrFriends(); // Do something about it.
state = COUNT_PEOPLE; // Start over.
}
else
{
nSlicesPerPerson = nSlices/nPeople;
state = EAT_PIZZA;
}
break;
case EAT_PIZZA:
// etc...
state = NO_PIZZA; // Exit the state machine.
break;
} // switch
} // while

注释:

  • 为简单起见,该示例使用具有显式 case/break 状态的 switch()。在实践中,案例通常会“失败”到下一个状态。

  • 为了便于维护大型状态机,每个case中完成的工作可以封装在“worker”函数中。获取 while() 顶部的任何输入,将其传递给辅助函数,并检查辅助函数的返回值以计算下一个状态。

  • 为了紧凑,整个 switch() 可以用函数指针数组替换。每个状态都由一个函数体现,该函数的返回值是指向下一个状态的指针。 警告:这可能会简化状态机或使其完全无法维护,因此请仔细考虑实现!

  • 嵌入式设备可以实现为状态机,仅在发生灾难性错误时退出,然后执行硬重置并重新进入状态机。

关于state-machine - 用于状态机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/255797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com