c - 创建初始化函数时“初始化元素不是常量”
问题描述
现在我正在尝试为预配置人员实现一个初始化函数。但是,当我尝试实现某些功能时,如以下代码所示,我收到错误消息initializer element is not constant
。我已经阅读了许多具有相同错误的问题,但是我无法将一个问题与我的案例联系起来。
代码如下:
#define CURR_CONFIG_X 4
#define CURR_CONFIG_Y 4
#define CURR_CONFIG_Z 4
typedef struct {
bool *tblX;
bool *tblY;
bool *tblZ;
} indicesInUse_t;
typedef struct {
tblPreCfgs_t *tblPreCfgs;
indicesInUse_t *tblEntryIndicesInUse;
} tblMgmt_t;
indicesInUse_t cfgIndicesInUse(indicesInUse_t *currIndicesInUse); //error takes place in this line
static indicesInUse_t currTblIndicesInUse = cfgIndicesInUse(&currTblIndicesInUse);
static tblMgmt_t flowTbleMgmt = {
.tblEntryIndicesInUse = &currTblEntryIndicesInUse,
};
indicesInUse_t cfgIndicesInUse(indicesInUse_t *currIndicesInUse) {
for (uint16_t index = 0; index < CURR_CONFIG_X; index++) {
currIndicesInUse->tblX[index] = true;
}
for (uint16_t index = 0; index < CURR_CONFIG_Y; index++) {
currIndicesInUse->tblYindex] = true;
}
for (uint16_t index = 0; index < CURR_CONFIG_Z; index++) {
currIndicesInUse->tblZ[index] = true;
}
return *currIndicesInUse;
}
解决方案
这是您将收到错误的示例:
static indicesInUse_t currTblIndicesInUse = cfgIndicesInUse(&currTblIndicesInUse);
这里currTblIndicesInUse
是一个static
变量,所以它的初始化器必须是一个常量表达式。这意味着它不能包含动态执行的代码,例如函数调用。
有两种方法可以解决这个问题。一种是更改初始化程序,使其成为常量表达式。另一种是删除初始化程序,而是使用赋值语句(在函数内部)初始化变量。然后,您将调用该函数来初始化它。
例如,最简单的常量初始化器是这样的:
static indicesInUse_t currTblIndicesInUse = {NULL, NULL, NULL};
这些NULL
值也可以是静态bool
变量或bool
数组的地址。
要动态初始化它,您只需调用一个函数,将struct
. 然后该函数将简单地设置结构的字段,例如
s_ptr->tblX = ptr_x;
s_ptr->tblY = ptr_y;
s_ptr->tblZ = ptr_z;
您需要自己填写具体细节,具体取决于您想要实现的目标。
请注意,在原始发布的代码中,即使允许动态初始化程序,它仍然无法工作,因为从未为指针变量分配空间。阅读有关指针如何工作的教程可能会有所帮助。
推荐阅读
- javascript - ExtJS 组合框过滤器
- c# - 返回 IAsyncEnumerable 的方法是否有明确的命名约定?
- python - 错误 1 不允许操作:Spyder 中的错误
- swift - Metal/Swift - 顶点缓冲区的第一个元素有一个错误的值
- apache-kafka - 如果 Zookeeper 节点关闭,Kafka 将不会启动
- wpf - 启动使用 ClickOnce 部署的 wpf 应用程序时出错
- javascript - 循环内的顺序 http 请求
- regex - 重定向域和页面 ID
- git - 分支合并时忽略一些文件
- simulation - AnyLogic 在一个过程中更改参数值