У меня проблема с инициализацией массива, который является частью массива структур. Тип структуры
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]'
Любые решения? благодаря
Я не знаю компилятора, который бы позволил вам иметь такую struct
. Казалось бы, невозможно понять, как получить доступ к flag
.
Если вы можете, реорганизовать myarray
в другую, связанную структуру.
Игнорируя проблемы компилятора, рассмотрите следующее:
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 { }
.
sizeof
на sizeof
. Трюк недопустим в C ++, но многие компиляторы в любом случае допускают это. Однако член, объявленный после такого массива, никогда не будет разрешен.
typedef struct { } name
в C ++, вы можете просто сделатьstruct name { }
. Вы должны выбрать один язык или другой.