ошибка: слишком много инициализаторов для 'tU8 [0] {aka unsigned char [0]}'

0

У меня проблема с инициализацией массива, который является частью массива структур. Тип структуры

typedef stuct {
   unsigned char myarray[]; 
   bool flag;
}myStructType;

Я создал массив этого типа структуры и хочу его инициализировать

myStructType myStruct[2] = {
   {
      {5,6,7},
      false
   },
   {
      {1,2},
      true
   }
};

myStruct - это структура конфигурации, и у меня есть код, который будет проходить через все элементы структуры, выполняющие некоторые действия на основе значений init.

Я использую компилятор arm-v5te-linux-gnueabi-g++ в встроенной платформе Linux.

Проблема в том, что когда я компилирую код, я получаю следующую ошибку

error: слишком много инициализаторов для 'unsigned char [0]'

Любые решения? благодаря

  • 2
    Какой компилятор и платформа? Такой член нестандартный.
  • 0
    Вам не нужен трюк с typedef struct { } name в C ++, вы можете просто сделать struct name { } . Вы должны выбрать один язык или другой.
Показать ещё 3 комментария
Теги:
arrays
initialization

2 ответа

0

Я не знаю компилятора, который бы позволил вам иметь такую struct. Казалось бы, невозможно понять, как получить доступ к flag.

Если вы можете, реорганизовать myarray в другую, связанную структуру.

0

Игнорируя проблемы компилятора, рассмотрите следующее:

struct myStructType {
   unsigned char myarray[]; 
   bool flag;
};

myStructType a = { { 5, 6, 7 }, true };
myStructType b = { { 1, 2 }, true };

Что такое sizeof(myStructType) (или, что более важно, что такое смещение flag)? Это безответственно, потому что эта ситуация невозможна. У вас есть несколько вариантов. Вы можете жестко myarray максимальный размер для myarray:

struct myStructType {
   unsigned char myarray[4]; 
   bool flag;
};

Вы можете сделать это указателем и инициализировать массивы отдельно:

struct myStructType {
   unsigned char *myarray; 
   bool flag;
};

unsigned char a[] = { 5, 6, 7 };
unsigned char b[] = { 1, 2 };
myStructType myStruct[2] = { { a, true }, { b, false } };

Вы можете сделать то же самое, что и выше, но вместо этого используйте строки с нулевым завершением:

struct myStructType {
   unsigned char *myarray; 
   bool flag;
};

unsigned char a[] = "\005\006\007";
unsigned char b[] = "\001\002";
myStructType myStruct[2] = { { a, true }, { b, false } };

Или напрямую, если const нормально на myarray:

struct myStructType {
   const unsigned char *myarray; 
   bool flag;
};

myStructType myStruct[2] = { 
    { "\005\006\007", true }, 
    { "\001\002", false } 
};

Есть и другие варианты.

Кстати, вам не нужен синтаксис typedef struct { } name в C++, вы можете просто создать struct name { }.

  • 0
    На самом деле, массивы неопределенного размера допускаются как элементы в C. Они просто не sizeof на sizeof . Трюк недопустим в C ++, но многие компиляторы в любом случае допускают это. Однако член, объявленный после такого массива, никогда не будет разрешен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню