Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C &引用;初始值设定项元素不是常量;在创建Init函数时_C_Initialization - Fatal编程技术网

C &引用;初始值设定项元素不是常量;在创建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;

现在我正在尝试为预先配置的人员实现Init函数。然而,正如在下面的代码中一样,当我尝试实现某个函数时,我收到一个错误
初始化器元素不是常量
。我读过很多有相同错误的问题,但我无法将其中一个与我的案例联系起来

代码如下:

#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)
不是。你能用一个例子详细解释一下,如何实现这两个选项吗?好的,我添加了更多的细节,但你可能应该在过于担心初始化之前试着更好地理解指针。代码中还有其他需要修复的问题(例如为数组分配空间)。您能用一个示例详细解释一下如何实现这两个选项吗?好的,我添加了更多细节,但您可能应该尝试更好地理解指针,然后再过多地担心初始值设定项。代码中还有其他问题需要解决(例如为数组分配空间)。