Я пишу стек IrDA в c и внедряю компонент службы доступа к информации, и мне нужна таблица поиска для пар класс / ключ / значение. Чтобы сохранить его в упорядоченном формате, я пытаюсь поместить все это в один инициализатор. следующий код прекрасно работает и компилирует данные в компактные связанные таблицы в ПЗУ.
#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))
, однако это просто кажется грязным. Мне бы очень хотелось выяснить правильный синтаксис, чтобы сделать это правильно.