c - 错误:初始化元素在 C 中不是常量
问题描述
在这里,我正在尝试制作状态机,其中 FsmHdlr 应该根据状态和事件调用适当的函数。我得到了上述错误。如何解决这个问题。
S16 handleParamReqEvt(void)
{
/* doing something */
RETVALUE(ROK);
}
S16 handleParamRspEvt(param_resp *paramRsp)
{
/* doing something */
RETVALUE(ROK);
}
typedef enum{
IDLE,
CONFIGURED,
MAX_STATE
}STATE;
/* Events in CL */
typedef enum{
PARAM_REQ,
PARAM_RSP
MAX_EVENT
}EVENT;
param_resp *paramMsg;
S16 FsmHdlr[MAX_STATE][MAX_EVENT] =
{
{
/* PHY_STATE_IDLE */
handleParamReqEvt(), //error :initializer element is not constant
handleParamRspEvt(paramMsg) //error: initializer element is not constant
}
};
解决方案
听起来您实际上并不想在初始化期间调用该函数(正如您所发现的那样,无论如何您都不能对静态存储变量执行此操作)。听起来您正在构建一个调度表。你想要的是一个函数指针。
这是使用函数指针的方式:
int foo(void) { ... }
int main(void) {
int (*bar)(void) = foo;
bar(); // Calls foo
}
由于参数根据事件的类型而有所不同,因此二维数组没有多大意义。我会在你的情况下使用以下内容:
S16 fsm_hdrl_idle_param_req(void) { ... }
S16 fsm_hdrl_idle_param_rsp(ParamRsp *param_rsp) { ... }
S16 fsm_hdrl_conf_param_req(void) { ... }
S16 fsm_hdrl_conf_param_rsp(ParamRsp *param_rsp) { ... }
typedef S16 (*FsmReqHdlr)(void);
typedef S16 (*FsmRspHdlr)(ParamRsp*);
typedef struct {
FsmReqHdlr fsm_req_hdlr;
FsmRspHdlr fsm_rsp_hdlr;
} FsmHdlrs;
FsmHdlrs fsm_hdlrs_by_state[MAX_STATE] = {
{ fsm_hdrl_idle_param_req, fsm_hdrl_idle_param_rsp },
{ fsm_hdrl_conf_param_req, fsm_hdrl_conf_param_rsp },
};
之后:
fsm_hdlrs_by_state[state].fsm_req_hdlr();
fsm_hdlrs_by_state[state].fsm_rsp_hdlr(param_rsp);
推荐阅读
- apache - 为什么在收到 301 状态响应时将“主机”标头设置为不正确的值
- postgresql - 磁盘位图索引上发生了什么?
- reactjs - Conditionally applying className to a react component depending on where the component is used
- node.js - 离线先react原生应用(nodejs、mongodb)
- powershell - 在变量 remove-item 中找到的 Foreach 路径
- google-analytics - 数据洞察 - 一条图表线中的 GA 事件很少
- wso2 - 将第一个 prosy 服务的输出传递给 WSO2 集成工作室中的第二个代理服务
- vue.js - 如何在 VueJS 过滤器中处理 NULL?
- apache-spark - PySpark:执行相同的操作,多列
- javafx - JavaFx:SplitPane 动态滚动条