gpt4 book ai didi

c - MDK-ARM C错误: expression must have a constant value

转载 作者:行者123 更新时间:2023-11-30 20:36:08 33 4
gpt4 key购买 nike

我正在使用RealView(基于ARMCC)编译器的MDK-ARM环境中编写基于状态机的嵌入式C代码。

IDE 生成错误:

error: #28: expression must have a constant value.

部分代码如下:

struct wspace
{
struct netimer period;
struct nequeue deferred;
struct nevent *deferred_queue_storage[EPA_EEPROM_QUEUE_SIZE];
struct nepa *producer;
struct event_i2c_transfer transfer;
uint32_t i2c_retry;
uint8_t i2c_buffer[3];
uint32_t address;
uint8_t *raw_buffer;
uint32_t size;
uint32_t idx;
uint32_t max_size;
uint32_t dev_id;
};

static naction state_init_eeprom(struct nsm * sm, const struct nevent * event) {
struct wspace * ws = nsm_wspace(sm);

switch (event->id) {
case NSM_INIT : {
struct nequeue_define deferred_queue =
**NEQUEUE_DEF_INIT(ws->deferred_queue_storage, sizeof(ws->deferred_queue_storage));** // this is the line pointed by compiler

netimer_init(&ws->period);
nequeue_init(&ws->deferred, &deferred_queue);
ws->transfer.super = g_default_event;
ws->transfer.super.producer = nepa_get_current();
ws->transfer.dev_id = EEPROM_I2C_ID;
ws->transfer.timeout_ms = EEPROM_I2C_TIMEOUT_MS;
ws->max_size = 8 * 1024;
ws->dev_id = EEPROM_I2C_ID;

return (naction_transit_to(sm, state_idle));
}
default : {
return (naction_ignored());
}
}
}

重要定义:

#define NEQUEUE_SIZEOF(elements)                                                
(sizeof(struct nevent * [elements]))

#define NEQUEUE_DEF_INIT(storage, size)
{storage, size}

struct nequeue_define
{
struct nevent ** storage;/**<@brief Allocated memory storage */
size_t size; /**<@brief Size of queue in bytes */
};


struct nequeue
{
struct nqueue queue;
#if (CONFIG_REGISTRY == 1)
ncore_reg min;
#endif
#if (CONFIG_API_VALIDATION == 1)
unsigned int signature;
#endif
};

我在这个主题上发现的所有内容都与以下事实有关:常量变量不能作为初始值设定项分配给数组的元素或结构的成员,即使它之前已经初始化过。

有人知道如何解决这个问题吗?

最佳答案

您不能在常量表达式中使用变量的内容,并且您的结构初始化器是常量表达式。

虽然 sizeof(ws->deferred_queue_storage) 没问题,因为它的值可以在编译时确定; ws->deferred_queue_storage 无效,因为该变量的内容可以是任何内容。

解决方案是在分配后使用赋值:

struct nequeue_define deferred_queue;
deferred_queue.storage = ws->deferred_queue_storage;
deferred_queue.size = sizeof(ws->deferred_queue_storage);

关于c - MDK-ARM C错误: expression must have a constant value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36714296/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com