2010-12-03 33 views
0

我正在編寫一個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_tIAS_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))但是這只是感覺很髒。我真的很想弄清楚正確的語法,以正確的方式做到這一點。

回答

0

沒關係。 在我徹底的沮喪,似乎我嘗試了每一個變形吧,我把它放在這裏。 (*(IAS_Database[class].attributes))[attr]確實工作正常,甚至工作時表示爲(*IAS_Database[class].attributes)[attr]我相信編譯器錯誤地認爲第一個指針(是一個UBYTE **)實際上是一個列表,並試圖將索引應用於指針類型(其中類型不完整)。

-1
typedef IAS_Attrib_t* IAS_Attrib_List_t[]; 

你爲什麼使用這些括號?使用裏面的數字或刪除它們

+0

我使用括號,因爲列表的長度在IAS_Attrib_List_t類型的所有實例中都不相同,因此不能放在括號中。 – Thomas 2010-12-03 07:40:37