我目前正在把头放在 proper 状态机上,发现这篇文章似乎正是我一直在寻找的内容: https://aticleworld.com/state-machine-using-c/ 在理解基于表的状态机的表的过程中,我偶然发现了这段代码,我认为这部分代码很难阅读。
这是我所能做到的:
eSystemState是一个类型定义的枚举,指示当前状态。
eSystemEvent是一个类型定义的枚举,它指示当前事件。
pfEventHandler是返回eSystemState的类型定义的函数指针。
afEventHandler是一个类型定义的二维数组(受“ last_State”和“ last_Event”限制),其函数指针返回eSystemState。
接下来是每种事件类型的一些事件处理程序。 然后从main开始,进行一些初始化。
以前定义的类型afEventHandler充满了内容,但是其中使用的操作对我来说是一个很大的谜。
我知道,对于每个大括号,都会填充一个新的“行”,但是枚举周围的方括号是什么意思,为什么一个人显然可以将一个值分配给由此产生的结果呢?
我知道枚举本质上是数字,而且我怀疑这是(对我而言)一种处理数组中特定元素的超级模糊方法。
我错了吗?
// Table to define valid states and event of finite state machine
static afEventHandler StateMachine = {
[Idle_State] ={[Card_Insert_Event]= InsertCardHandler },
[Card_Inserted_State] ={[Pin_Enter_Event] = EnterPinHandler },
[Pin_Eentered_State] ={[Option_Selection_Event] = OptionSelectionHandler},
[Option_Selected_State] ={[Amount_Enter_Event] = EnterAmountHandler},
[Amount_Entered_State] ={[Amount_Dispatch_Event] = AmountDispatchHandler},
};
答案 0 :(得分:6)
此语法适用于指定的初始化程序。它允许您初始化数组的特定元素。
方括号中的值是要初始化的数组元素的索引。在这种情况下,它是一个枚举值,但它可以是任何整数。
答案 1 :(得分:1)
方括号标记数组下标。其中的enum
标识符只是普通表达式,由enum
值代替。
C允许您使用称为 designers 的显式下标初始化数组。例如,将A[1]
初始化为4:
int A[3] = { [1] = 4 };
(其他元素默认为零。)
使用二维数组,语法会变得更加复杂:
int B[3][4] =
{
[1] = { [3] = 7 }
};
这会将B[1][3]
初始化为7。这就是您在所引用的代码中看到的语法。然后,它使用enum
之类的Idle_State
标识符代替上面显示的样本常量1
,3
和7
。
答案 2 :(得分:0)
我自己找到了它,它是一个“ 指定的初始值设定项”,它确实指定了应由所选值设置的元素。
它在C99中引入,它解释了为什么我不知道它的原因。其他元素初始化为0。
我将把问题留在这里,让其他可能对此感到疑惑的人。 How to initialize only few elements of an array with some values?
int a[10][10] = {
{},
{[5] = 8}
};
意味着在第二行中,元素5将被初始化为八个,其他元素将为零。