[英]error#29 expected an expression
以下是二維數組的代碼將引發錯誤#29預期為表達式。
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);
}
}
這個想法是基於接收到的事件執行狀態機。 2D數組列出了當前狀態以及該狀態的所有可能事件,一旦接收到事件,就會調用一個函數指針,並且該狀態將轉換到下一個狀態。
我正在將MicroC / OS2與GreenHills編譯器/工具一起使用。 非常感謝您的回復。
我遵循了基思的建議
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 }}
};
基思的答案幫助我弄清楚了正確的初始化。 我必須列出{{}}中給定狀態的所有可能的事件和關聯的函數指針。
這就像初始化row [0] [0]和row [0] [1]的元素一樣,我必須列出頂級雙花括號內的所有元素,例如
{ **{{**values/function/events associated with row [0][0],{values/function/events associated with row [0][1] }},
//now do the same for row 1.
**{{**values/function/events associated with row [1][0],{values/function/events associated with row [1][1] **}}** }; //end of the array
BMTAction_t action[END_STATE][END_EVENT] = {
//STATE = BATTERY_POW
{{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
//STATE = USB_POW
{{NULL,USB_POW}, //0
{BMTProcess_BatteryPowBoot,USB_POW},// 1
{BMTProcess_PowGoodLow,USB_POW},//2
{BMTProcess_PowGoodHigh,USB_POW}, //3
{BMTProcess_VBUSPowerLow,USB_POW}, //4
{BMTProcess_VBUSPowerHigh,USB_POW}}//5
};
如果使用-c99
選項,則您正在使用的初始化將與greenhills編譯器一起使用。
我必須對您的代碼進行一些小的更改才能進行編譯:
END_EVENT
枚舉 action
聲明的各項之間添加一些逗號。 USB_POW_
至USB_POW
這是修改后的代碼:
#include <stdio.h>
typedef enum {
BATTERY_POW = 0,
USB_POW = 1,
END_STATE = 2
} BMTState_e;
typedef enum {
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,
END_EVENT = 6
} BMTEvent_e;
typedef struct {
void (*funcPtr)();
BMTState_e nextState;
} BMTAction_t;
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}
};
int main()
{
return 1;
}
這是不帶-c99
的編譯器輸出:
$ ccppc test.c
"test.c", line 30: error #29: expected an expression
[BATTERY_POW][NO_EVENT] = {BMTTest,BATTERY_POW},
^
"test.c", line 31: error #29: expected an expression
[BATTERY_POW][BOOT_EVENT] = {BMTTest,BATTERY_POW},
^
"test.c", line 32: error #29: expected an expression
[BATTERY_POW][POW_GOOD_LOW] = {BMTTest,USB_POW},
^
"test.c", line 33: error #29: expected an expression
[BATTERY_POW][POW_GOOD_HIGH] = {BMTTest,BATTERY_POW},
^
"test.c", line 34: error #29: expected an expression
[BATTERY_POW][VBUS_POW_LOW] = {BMTTest,BATTERY_POW},
^
"test.c", line 35: error #29: expected an expression
[BATTERY_POW][VBUS_POW_HIGH] = {BMTTest,USB_POW},
^
"test.c", line 36: error #29: expected an expression
[USB_POW][BOOT_EVENT] = {BMTTest,USB_POW},
^
"test.c", line 37: error #29: expected an expression
[USB_POW][BOOT_EVENT] = {BMTTest,USB_POW},
^
"test.c", line 38: error #29: expected an expression
[USB_POW][POW_GOOD_LOW] = {BMTTest,USB_POW},
^
"test.c", line 39: error #29: expected an expression
[USB_POW][POW_GOOD_HIGH] = {BMTTest,BATTERY_POW},
^
"test.c", line 40: error #29: expected an expression
[USB_POW][VBUS_POW_LOW] = {BMTTest,BATTERY_POW},
^
"test.c", line 41: error #29: expected an expression
[USB_POW][VBUS_POW_HIGH] = {BMTTest,USB_POW}
^
和-c99
:
$ ccppc -c99 test.c
您確實意識到您的代碼包括以下內容:
[USB_POW][BOOT_EVENT] = {BMTTest,USB_POW_}
[USB_POW][BOOT_EVENT] = {BMTTest,USB_POW},
甚至我也會對此感到困惑。 您是說第一個成為NO_EVENT
嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.