首页 > 解决方案 > 创建初始化函数时“初始化元素不是常量”

问题描述

现在我正在尝试为预配置人员实现一个初始化函数。但是,当我尝试实现某些功能时,如以下代码所示,我收到错误消息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;
}

标签: cinitialization

解决方案


这是您将收到错误的示例:

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;

您需要自己填写具体细节,具体取决于您想要实现的目标。

请注意,在原始发布的代码中,即使允许动态初始化程序,它仍然无法工作,因为从未为指针变量分配空间。阅读有关指针如何工作的教程可能会有所帮助。


推荐阅读