【发布时间】:2016-09-02 11:33:10
【问题描述】:
我正在尝试用 C 创建一个状态机。这个状态机依赖于四个相互关联的事件。为了表示它,我想显示一个数组,
StateEventProcess[max_states][no_of_alarm][no_alarm_hsyt][timer_Status];
所有的索引都是一些数字,分别是 5,2,2,2。
我想实现一个可以触发回调函数的状态机表
我只为状态和条件元组实现了它。
enum states
{
en_AI_NO_ALARM_s1, en_AI_LOW_ALARM_s2, en_AI_HIGH_ALARM_s3, en_AI_SENSOR_BREAK_s4, en_AI_UNDER_CALIBRATION_s5
}
current_state;
enum events
{
COND_1, COND_2, COND_3, COND_4
}
new_cond;
void action_s1_c1 (void);
void action_s1_c2 (void);
void action_s1_c3 (void);
void action_s1_c4 (void);
void action_s2_c1 (void);
void action_s2_c2 (void);
void action_s2_c3 (void);
void action_s2_c4 (void);
.
.
.
.
enum events GetNewCond (void)
{
if(Val < LowAlarm)
return COND_1;
if(val > LowAlarm)
return COND_2;
if(Val < HighAlarm)
return COND_3;
if(val > HighAlarm)
return COND_4;
}
void (*const state_table [MAX_STATES][MAX_COND]) (void) = {
{ action_s1_c1, action_s1_c2, action_s1_c3, action_s1_c4}, /* procedures for state 1 */
{ action_s2_c1, action_s2_c2, action_s2_c3, action_s2_c4}, /* procedures for state 2 */
{ action_s3_c1, action_s3_c2, action_s3_c3, action_s3_c4}, /* procedures for state 3 */
{ action_s4_c1, action_s4_c2, action_s4_c3, action_s4_c4}, /* procedures for state 4 */
{ action_s5_c1, action_s5_c2, action_s5_c3, action_s5_c4}, /* procedures for state 5 */
};
但是以我在上面处理 2d 数组的方式处理 4d 数组对我来说相当混乱。请帮我实现同样的。
【问题讨论】:
-
4D 数组几乎肯定不是您想要的。但无论哪种方式,您都没有解释具体问题是什么,即不清楚您在问什么。
-
我不想使用 for 循环,而是想使用一个可以作为源来触发特定情况下的回调的表。情况可能是:LOW_ALARM、LOW_ALARM、HIGH_HYST、TIMER_OFF
标签: c