Как я могу объявить указатель на константный литерал структуры, который использует гибкий массив в C, если это возможно?Linux

Ответить Пред. темаСлед. тема
Anonymous
 Как я могу объявить указатель на константный литерал структуры, который использует гибкий массив в C, если это возможно?

Сообщение Anonymous »

Поэтому я хотел сохранить некоторый постоянный текст и данные для частей уровня игры в структуре, затем поместить указатели на все эти структуры в структуру для каждого уровня, а указатели на все структуры уровней в структуру для игра. Кажется, это работает, если я использую имена переменных для каждой из вложенных структур данных. Однако это довольно громоздко, поскольку я, скорее всего, изменю все данные и переупорядочу все уровни по мере их разработки, поэтому я хотел сделать это без необходимости указывать имена переменных для каждого уровня и частей уровня. Я узнал, что вы можете использовать указатели на литералы, однако это не работает, когда объявляемая вами структура имеет гибкий массив.
Вот пример того, что я сейчас делаю :

Код: Выделить всё

struct level_part{
const int data;
const char text[];
};

struct level_full{
const int numParts;
const struct level_part * parts[];
};

struct game{
const int numLevels;
const struct level_full * levels[];
}

const struct level_part l0p0 = { 101, "Hello" };
const struct level_part l0p1 = { 331, "Goodby" };
const struct level_part l1p0 = { 912, "No way" };

const struct level_full l0 = { 2, {&l0p0, &l0p1} };
const struct level_full l1 = { 1, {&l1p0} };

const struct game gameLevels = { 2, {&l0, &l1} };
Поскольку переменные используются только один раз во время объявления и мешают мне переставлять и изменять что-то, я надеялся объявить все в одном большом литерале. Я обнаружил, что вы можете использовать указатель на литерал, используя что-то вроде &(int){5}, и я хотел сделать это здесь, но столкнулся с проблемой, когда компилятор gcc жаловался, что структура содержит гибкую структуру. ошибка массива: нестатическая инициализация гибкого члена массива, когда я делаю что-то вроде этого:

Код: Выделить всё

const struct level_full l1 = { 1, { &(const struct level_part){ 912, "No way" } } };
Я думаю, что старая версия l1 эквивалентна этой версии, потому что, насколько я понимаю, литерал нужно ставить в инициализируемые данные или текст во время компиляции он должен просто получить указатель на эти данные и передать его l1. Однако, похоже, компилятор с этим не согласен. Я делаю что-то неправильно, это неправильный способ или то, что я пытаюсь сделать, просто невозможно в C? Хотя я получил ошибку в gcc, мне нужно, чтобы мое решение было переносимо и для компилятора Windows.
Если то, что я делаю, невозможно, есть ли какие-либо другие альтернативы тому, что я делаю? Я как бы надеялся, что смогу просто хранить все эти постоянные данные в программе без необходимости выделять их или использовать отдельный файл.

Подробнее здесь: https://stackoverflow.com/questions/787 ... lexible-ar
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»