未指定长度的数组的问题

时间:2010-12-03 05:46:45

标签: c types initialization

我在c中编写IrDA堆栈并实现信息访问服务组件,我需要一个类/键/值对的查找表。为了保持有序的格式,我试图把它全部放到一个初始化器中。以下代码工作正常,并将数据编译为压缩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*

然而,当我尝试查询表时,我从mspgcc返回invalid use of array with unspecified bounds。即使像(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))这样的空白,但这只是感觉很脏。我真的想找出正确的语法来正确地做到这一点。

2 个答案:

答案 0 :(得分:0)

没关系。 在我完全沮丧的情况下,似乎我尝试了每个变种栏,我在这里放了一个。 (*(IAS_Database[class].attributes))[attr]确实正常工作,甚至在表达为(*IAS_Database[class].attributes)[attr]时工作我相信编译器错误地认为第一个指针(对于UBYTE **)实际上是一个列表并且正在尝试应用索引到指针类型(类型不完整)。

答案 1 :(得分:-1)

typedef IAS_Attrib_t* IAS_Attrib_List_t[];

为什么使用这些括号?在里面使用数字或删除它们