Проблемы с массивами неопределенной длины - PullRequest
0 голосов
/ 03 декабря 2010

Я пишу стек 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)), однако это просто кажется грязным. Мне бы очень хотелось выяснить правильный синтаксис, чтобы сделать это правильно.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2010

Неважно.В моем полном разочаровании кажется, что я попробовал каждый вариант бар, который я поставил здесь.(*(IAS_Database[class].attributes))[attr] действительно работает должным образом и даже работает, когда выражено как (*IAS_Database[class].attributes)[attr] Я полагаю, что компилятор неправильно предполагал, что первый указатель (на UBYTE **) на самом деле был списком и пытался применить индекс к типу указателя(где тип неполный).

0 голосов
/ 03 декабря 2010
typedef IAS_Attrib_t* IAS_Attrib_List_t[];

почему вы используете эти скобки? используйте число внутри или удалите их

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...