我正在編寫一個IrDA堆棧在c中,實現信息訪問服務組件,我需要一個查找表類/鍵/值對。爲了保持它有序的格式,我試圖把它放在一個初始化程序中。下面的代碼工作得很好,並將數據編譯爲ROM中的緊湊鏈接表。未指定長度的數組的問題
#define IAS_PTYPE_STRING 0x00
#define IAS_PTYPE_BYTE 0x01
typedef struct {
UBYTE* name;
UBYTE type;
UBYTE* value;
} IAS_Attrib_t ;
typedef IAS_Attrib_t* IAS_Attrib_List_t[];
typedef struct {
UBYTE* name;
IAS_Attrib_List_t* attributes;
} IAS_Class_t;
static const IAS_Class_t IAS_Database[] = {
{"IrDA:IrCOMM",
&(IAS_Attrib_List_t){
&(IAS_Attrib_t){"Parameters", IAS_PTYPE_STRING, "IrDA:TinyTP:LsapSel"},
NULL,
},
},
};
但是我無法將數據恢復出來。根據所使用的類型,我應該可以做這樣的事情:
UBYTE class = 1;
UBYTE attr = 1;
UBYTE* name = (*(IAS_Database[class].attributes))[attr]->name;
這是因爲
IAS_Database[class].attributes
是類型IAS_Attrib_List_t*
*(IAS_Database[class].attributes)
的類型是IAS_Attrib_List_t
即IAS_Attrib_t*[]
(*(IAS_Database[class].attributes))[attr]
應是類型IAS_Attrib_t*
(*(IAS_Database[class].attributes))[attr]->name
的類型應該爲UBYTE*
然而,當我嘗試查詢表,我得到invalid use of array with unspecified bounds
從MSPGCC回來。即使像(IAS_Attrib_t*)((IAS_Database[class].attributes)+(sizeof(IAS_Attrib_t)*attr))
這樣的破解失敗,直到我把數據庫丟棄,如(IAS_Attrib_t*)((void*)(IAS_Database[class].attributes)+(sizeof(IAS_Attrib_t)*attr))
但是這只是感覺很髒。我真的很想弄清楚正確的語法,以正確的方式做到這一點。
我使用括號,因爲列表的長度在IAS_Attrib_List_t類型的所有實例中都不相同,因此不能放在括號中。 – Thomas 2010-12-03 07:40:37