C &引用;初始值设定项元素不是常量;在创建Init函数时
现在我正在尝试为预先配置的人员实现Init函数。然而,正如在下面的代码中一样,当我尝试实现某个函数时,我收到一个错误C &引用;初始值设定项元素不是常量;在创建Init函数时,c,initialization,C,Initialization,现在我正在尝试为预先配置的人员实现Init函数。然而,正如在下面的代码中一样,当我尝试实现某个函数时,我收到一个错误初始化器元素不是常量。我读过很多有相同错误的问题,但我无法将其中一个与我的案例联系起来 代码如下: #define CURR_CONFIG_X 4 #define CURR_CONFIG_Y 4 #define CURR_CONFIG_Z 4 typedef struct { bool *tblX; bool *tblY;
初始化器元素不是常量。我读过很多有相同错误的问题,但我无法将其中一个与我的案例联系起来
代码如下:
#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;
}
#定义当前配置#X 4
#定义当前配置4
#定义当前配置4
类型定义结构{
bool*tblX;
bool*tblY;
bool*tblZ;
}指示使用;
类型定义结构{
tblPreCfgs_t*tblPreCfgs;
指示使用双鼻窦;
}tblMgmt;
指示使用CFGINDICUSE(指示使用*当前指示使用)//该行发生错误
静态指示器使用电流盲信号=电流盲信号(和电流盲信号);
静态tblMgmt\u t流量TblemGMT={
.tblentryindiescuse=&currtblentryindiescuse,
};
指标使用率(指标使用率*当前指标使用率){
对于(uint16\u t index=0;indextblX[索引]=真;
}
对于(uint16\u t index=0;indextblYindex]=真;
}
对于(uint16\u t index=0;indextblZ[索引]=真;
}
返回*当前指示使用;
}
下面是一个示例,您将从中获得错误:
static indicesInUse_t currTblIndicesInUse = cfgIndicesInUse(&currTblIndicesInUse);
这里的currtblindicesinus
是一个static
变量,因此它的初始值必须是一个常量表达式。这意味着它不能包含动态执行的代码,例如函数调用
有两种方法可以解决这个问题。一种是更改初始值设定项,使其成为常量表达式。另一种方法是删除初始值设定项,而是使用赋值语句(在函数内部)初始化变量。然后调用该函数对其进行初始化
例如,最简单的常量初始值设定项如下:
static indicesInUse_t currTblIndicesInUse = {NULL, NULL, NULL};
NULL
值也可以是静态bool
变量或bool
数组的地址
要动态初始化它,只需调用函数,将结构的地址传递给它。然后,该函数将简单地设置结构的字段,例如
s_ptr->tblX = ptr_x;
s_ptr->tblY = ptr_y;
s_ptr->tblZ = ptr_z;
你需要自己填写细节,这取决于你想要实现的目标
注意,在最初发布的代码中,即使允许使用动态初始值设定项,它仍然无法工作,因为从未分配空间
对于指针变量。阅读有关指针如何工作的教程可能会有所帮助。下面是一个错误示例:
static indicesInUse_t currTblIndicesInUse = cfgIndicesInUse(&currTblIndicesInUse);
这里的currtblindicesinus
是一个static
变量,因此它的初始值必须是一个常量表达式。这意味着它不能包含动态执行的代码,例如函数调用
有两种方法可以解决这个问题。一种是更改初始值设定项,使其成为常量表达式。另一种方法是删除初始值设定项,而是使用赋值语句(在函数内部)初始化变量。然后调用该函数对其进行初始化
例如,最简单的常量初始值设定项如下:
static indicesInUse_t currTblIndicesInUse = {NULL, NULL, NULL};
NULL
值也可以是静态bool
变量或bool
数组的地址
要动态初始化它,只需调用函数,将结构的地址传递给它。然后,该函数将简单地设置结构的字段,例如
s_ptr->tblX = ptr_x;
s_ptr->tblY = ptr_y;
s_ptr->tblZ = ptr_z;
你需要自己填写细节,这取决于你想要实现的目标
注意,在最初发布的代码中,即使允许使用动态初始值设定项,它仍然无法工作,因为从未分配空间
对于指针变量。阅读有关指针如何工作的教程可能会有所帮助。从哪里得到错误?请在您的问题中,在报告错误的准确行上添加注释。您不能使用常量以外的任何东西初始化全局变量<代码>intfoo=2代码>正常,intfoo=somefunction(bar)代码>不是。从哪里得到错误?请在您的问题中,在报告错误的准确行上添加注释。您不能使用常量以外的任何东西初始化全局变量<代码>intfoo=2代码>正常,intfoo=somefunction(bar)
不是。你能用一个例子详细解释一下,如何实现这两个选项吗?好的,我添加了更多的细节,但你可能应该在过于担心初始化之前试着更好地理解指针。代码中还有其他需要修复的问题(例如为数组分配空间)。您能用一个示例详细解释一下如何实现这两个选项吗?好的,我添加了更多细节,但您可能应该尝试更好地理解指针,然后再过多地担心初始值设定项。代码中还有其他问题需要解决(例如为数组分配空间)。