我正在用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))这样的hack都失败了,直到我像(IAS_Attrib_t*)((void*)(IAS_Database[class].attributes)+(sizeof(IAS_Attrib_t)*attr))一样将数据库强制转换为空,但这感觉实在太脏了。我真的很想找出正确的语法来以正确的方式进行操作。

最佳答案

没关系。
令我非常沮丧的是,我尝试了我在这里放置的每个变式酒吧。 (*(IAS_Database[class].attributes))[attr]确实可以正常工作,甚至可以用(*IAS_Database[class].attributes)[attr]表示,但我相信编译器错误地假设第一个指针(指向UBYTE **)实际上是一个列表,并试图将索引应用于指针类型(类型不完整的地方)。

关于c - 未指定长度数组的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4342832/

10-13 07:44