gpt4 book ai didi

c - error#29 需要一个表达式

转载 作者:太空宇宙 更新时间:2023-11-04 01:27:45 24 4
gpt4 key购买 nike

下面的二维数组代码会抛出错误 #29 expected an expression。

typedef  enum 
{
BATTERY_POW = 0,
USB_POW = 1,
END_STATE = 2
} BMTState_e;

typedef enum //event enums
{
NO_EVENT = 0,
BOOT_EVENT =1,
//I/O events
POW_GOOD_LOW =2,
POW_GOOD_HIGH = 3,
VBUS_POW_LOW = 4,
VBUS_POW_HIGH =5
}BMTEvent_e;

结构定义为

typedef struct  //state machine definition
{
void (*funcPtr)();
BMTState_e nextState;
}BMTAction_t;
BMTState_e BMTGlobal_State ; //global state

函数定义为

void BMTTest()
{
//do nothing for time being
}
BMTAction_t action[END_STATE][END_EVENT]={
[BATTERY_POW][NO_EVENT] = {BMTTest,BATTERY_POW}
[BATTERY_POW][BOOT_EVENT] = {BMTTest,BATTERY_POW},
[BATTERY_POW][POW_GOOD_LOW] = {BMTTest,USB_POW},
[BATTERY_POW][POW_GOOD_HIGH] = {BMTTest,BATTERY_POW}
[BATTERY_POW][VBUS_POW_LOW] = {BMTTest,BATTERY_POW},
[BATTERY_POW][VBUS_POW_HIGH] = {BMTTest,USB_POW},
[USB_POW][BOOT_EVENT] = {BMTTest,USB_POW_}
[USB_POW][BOOT_EVENT] = {BMTTest,USB_POW},
[USB_POW][POW_GOOD_LOW] = {BMTTest,USB_POW},
[USB_POW][POW_GOOD_HIGH] = {BMTTest,BATTERY_POW}
[USB_POW][VBUS_POW_LOW] = {BMTTest,BATTERY_POW},
[USB_POW][VBUS_POW_HIGH] = {BMTTest,USB_POW}
};

void BMT_HandleEvent(BMTEvent_e event)
{
BMTAction_t stAction;


if(event != NO_EVENT)
{
stAction.funcPtr = action[BMTGlobal_State][event].funcPtr;
stAction.nextState = action[BMTGlobal_State][event].nextState;
printf("current State =%d, event = %d, nextState = %d",BMTGlobal_State, event,stAction.nextState );

if(NULL!= stAction.funcPtr)
stAction.funcPtr();
BMTGlobal_State = stAction.nextState;
}

}

int main()
{
BMTEvent_e = BOOT_EVENT;
if(retVal)
{
BMTGlobal_State = BATTERY_POW;
}
else // PG is low so check VBUS signal
{
retVal = GPIO_Read_Pin(USB_VBUS_PWR_PIN);
if(retVal)
{
BMTGlobal_State = USB_POW;
}
else
{
BMTGlobal_State = CRADLE_POW;
}
}
event = BOOT_EVENT;
while (1)
{
BMT_HandleEvent(event);
}
}

想法是根据收到的事件执行状态机。二维数组列出当前状态和状态的所有可能事件,一旦接收到事件,将调用函数指针,状态将转换到下一个状态。

我正在使用带有 GreenHills 编译器/工具的 MicroC/OS2。非常感谢您的回复。

我听从了 Keith 的建议

BMTAction_t  action[END_STATE][END_EVENT] = {
{{NULL,BATTERY_POW}}, //0
{{BMTProcess_BatteryPowBoot,BATTERY_POW}},// 1
{{BMTProcess_PowGoodLow,BATTERY_POW}},//2
{{BMTProcess_PowGoodHigh,BATTERY_POW}}, //3
{{BMTProcess_VBUSPowerLow,BATTERY_POW}}, //4
{{BMTProcess_VBUSPowerHigh,BATTERY_POW}},//5
};

编译器在行报错

"{{BMTProcess_PowGoodHigh,BATTERY_POW}}, //3" 
"error # 146 too many initializer values"

最佳答案

这不是指定初始化程序的正确语法。一次只能指定一个索引。

我错了;允许使用多个指示符。事实上,在我添加一些声明后,使用 gcc -std=c99 -pedantic -Wall -Wextra 编译你的代码没有错误。

typedef enum { BATTERY_POW, END_STATE } BMTState_e;
typedef enum { BOOT_EVENT, POW_GOOD_LOW, POW_GOOD_HIGH, END_EVENT } BMTEvent_e;

void BMTTest(void);

typedef struct //state machine definition
{
void (*funcPtr)();
BMTState_e nextState;
}BMTAction_t;

BMTAction_t action[END_STATE][END_EVENT]={
[BATTERY_POW][BOOT_EVENT] = {BMTTest,BATTERY_POW},
[BATTERY_POW][POW_GOOD_LOW] = {BMTTest,BATTERY_POW},
[BATTERY_POW][POW_GOOD_HIGH] = {BMTTest,BATTERY_POW}
};

您的编译器很可能不理解指定的初始值设定项。 (它们是由 1999 年的标准添加到语言中的,即使在今天,也不是所有的编译器都支持它们。)

如果不是,则需要删除括号中的表达式(并确保元素的顺序正确)。大概是这样的:

BMTAction_t  action0[END_STATE][END_EVENT] = {
{{ BMTTest, BATTERY_POW }},
{{ BMTTest, BATTERY_POW }},
{{ BMTTest, BATTERY_POW }}
};

关于c - error#29 需要一个表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28271256/

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