Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не могу проинициализировать массив структур
Форум на CrossPlatform.RU > Разработка > С\С++
novichkov
Подскажите, пожалуйста, как правильно записать структуру, в которой есть массив строк и проинициализировать ее. У меня:

static const struct Menu {
    const char *key;
    const char *text;
    const char *actions[];
}
menusDescr[] = {
    {"file", QT_TR_NOOP("&File"), {"addDir","addFiles","split","","save",
                                   "saveAll","rereadTags","delFiles",
                                   "delAllFiles","","exit",0}},
    {"edit", QT_TR_NOOP("&Edit"), {"","cut","copy","paste","copyToClipboard",
                                   "pasteFromClipboard","","removeTags",
                                   "newTag","","settings",0}},
     // и т.д.
};


компилятор ругается на const char *actions[] :
error: too many initializers for 'const char* [0]'


Хотя
const char *A[] = {"a","b","c"};

работает нормально.
Iron Bug
если ты хочешь объявлять массив, то у элеметров должен быть известный заранее размер и он должен быть фиксированным.
в данный момент компилятор считает, что это const char *actions[0].
поставь нужное количество элементов (оно должно быть фиксированным, иначе массив не получится).
novichkov
Тогда почему const char *A[] = {"aa","bbb","c"}; компилируется нормально?
ilyabvt
Цитата
Тогда почему const char *A[] = {"aa","bbb","c"}; компилируется нормально?

Потому что в этом случае вы создаете массив размером 3. Хотя вы не задаете размер массив явно, компилятор может его посчитать, если вы сразу инициализируете массив конкретными значениями.
Iron Bug
проблема не в размере массива, а в размере его элемента. так как массивы располагаются в памяти последовательно и каждый элемент массива имеет одинаковый тип (т.е. одинаковый размер). но у вложенного массива размер не определён явно и компилятор присваивает ему значение 0 (по умолчанию).
novichkov
Спасибо за разъяснения. В итоге сделал так:

static const struct Menu {
    const char *key;
    const char *text;
    const char *actions;
}
menusDescr[] = {
    {"file", QT_TR_NOOP("&File"), "addDir,addFiles,split,,save,"
                                   "saveAll,rereadTags,delFiles,"
                                   "delAllFiles,,exit"},
    {"edit", QT_TR_NOOP("&Edit"), ",cut,copy,paste,copyToClipboard,"
                                   "pasteFromClipboard,,removeTags,"
                                   "newTag,,settings"},
     // и т.д.
};
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.