Перейти к содержанию
    

Инициализация структуры

Хотел немного схитрить, ну так, с краешку. Создал структуру

typedef struct
{
    uint32_t menu_id;
    char *menu_text;
}MENU_ITEM;

typedef struct
{
    MENU_ITEM main_menu;
    MENU_ITEM *submenu;
}MENU;

Инициализирую

MENU menu[] =
{
    {  { 1, "MENU1"},
       { {0, "SUBMENU1" }, { 1, "SUBMENU2" }, { 2, "SUBMENU3" } }
    }
};

Компилятор ругается на уровне ворнинга

(near initialization for 'menu[1].submenu') [enabled by default]

braces around scalar initializer [enabled by default]

excess elements in scalar initializer [enabled by default]

initialization makes pointer from integer without a cast [enabled by default]

причем если убираю скобки ругается на уровне ошибки.

 

Не хочет видеть как указатель на массив. Все так плохо или можно что то сделать?

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не хочет видеть как указатель на массив. Все так плохо или можно что то сделать?

все имено так плохо

делайте { {0, "SUBMENU1" }, { 1, "SUBMENU2" }, { 2, "SUBMENU3" } } - отдельной константой.

код станет чуть менее красивым, но по моему - не сильно ухудшится. терпимо будет.

 

Изменено пользователем AlexRayne

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

все имено так плохо

делайте { {0, "SUBMENU1" }, { 1, "SUBMENU2" }, { 2, "SUBMENU3" } } - отдельной константой.

код станет чуть менее красивым, но по моему - не сильно ухудшится. терпимо будет.

 

я хотел чтоб это был единый объект.

 

отдельно он тоже не принимает как массив структур. только если определяю статический массив.

 

ну разве что так?

MENU_ITEM subm[]= { {0,"SUBMENU1"}, {1,"SUBMENU2"} , {2,"SUBMENU2"}, {3,"SUBMENU3"} };
MENU menu[5];

menu[0].main_menu.menu_id = 1;
menu[0].main_menu.menu_text = "MENU1";
menu[0].submenu= subm;

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

MENU menu[] =
{
    {  { 1, "MENU1"},
       { {0, "SUBMENU1" }, { 1, "SUBMENU2" }, { 2, "SUBMENU3" } }
    }
};

И на кой на это тратить ОЗУ??? :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

причем если убираю скобки ругается на уровне ошибки.

Как Вы собираетесь объявить массив, содержащий указатель на объект, который еще не объявлен? Вот и весь ответ на вопрос о возможности так схитрить.

typedef struct
{
    uint32_t menu_id;
    char *menu_text;
}MENU_ITEM;

typedef struct
{
    MENU_ITEM main_menu;
    MENU_ITEM *submenu;
}MENU;

int main(void)
{
    MENU_ITEM item[3] = {{0, "SUBMENU1"}, {1, "SUBMENU2"}, {2, "SUBMENU3"}};
    
    MENU menu[] = {{{1, "MENU1"}, &item[0]}, {{1, "MENU1"}, &item[1]}, {{1, "MENU1"}, &item[2]}};
    
    return 0;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как Вы собираетесь объявить массив, содержащий указатель на объект, который еще не объявлен? Вот и весь ответ на вопрос о возможности так схитрить.
Но инициализируя я же его объявляю. я передаю реальные адреса.

 

получается промежуточный массив. а что компилятор не достаточно умный чтоб сделать подстановку?

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но инициализируя я же его объявляю. я передаю реальные адреса.

Да ну? Где это Вы реальные адреса там передаете, не подскажете?

 

получается промежуточный массив. а что компилятор не достаточно умный чтоб сделать подстановку?

Какой еще промежуточный массив? Компилятор не достаточно умный? Где-то я подобное смелое утверждение слышал уже. И вроде от Вас :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

динамика....

в меню....

наибессмысленнейшее решение.

 

нет, я всё понимаю, если бы у вас был фронтенд-бэкенд с джаваскриптом, node.js и танцовщицами, но нет же, это тупо голый Си!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

В записи просто недостаточно информации, чтобы вывести тип. Компилятор не сможет корректно такое обработать )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё будет во флэш, инициализация не нужна.

typedef struct
{
    const uint32_t menu_id;
    const char *menu_text;
} MENU_ITEM;

typedef struct
{
    const MENU_ITEM main_menu;
    const MENU_ITEM *submenu;
} MENU;

const MENU_ITEM submenu1[] = { {0, "SUBMENU1" }, { 1, "SUBMENU2" }, { 2, "SUBMENU3" } };
const MENU_ITEM submenu2[] = { {0, "SUBMENU1" }, { 1, "SUBMENU2" }, { 2, "SUBMENU3" } };
const MENU menu[] =
{
    { { 1, "MENU1"}, submenu1 },
    { { 2, "MENU2"}, submenu2 }
};

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё будет во флэш, инициализация не нужна.

typedef struct
{
     const uint32_t menu_id;
     const char *menu_text;
} MENU_ITEM;

typedef struct
{
     const MENU_ITEM main_menu;
     const MENU_ITEM *submenu;
} MENU;

const MENU_ITEM submenu1[] = { {0, "SUBMENU1" }, { 1, "SUBMENU2" }, { 2, "SUBMENU3" } };
const MENU_ITEM submenu2[] = { {0, "SUBMENU1" }, { 1, "SUBMENU2" }, { 2, "SUBMENU3" } };
const MENU menu[] =
{
     { { 1, "MENU1"}, submenu1 },
     { { 2, "MENU2"}, submenu2 }
};

ну а если я записал

{ { 1, "MENU1"},  { {0, "SUBMENU1" }, { 1, "SUBMENU2" }, { 2, "SUBMENU3" } } },

какая разница компилятору. в чем его трудности. это не одно и то же?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

какая разница компилятору. в чем его трудности. это не одно и то же?

Я думаю у него трудностей нет, только у вас. Так как не он пишет в форум, а вы. :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Janya7 - вы случайно не состоите в родстве с Гастингсом?

 

— Ну что вы, Пуаро, — пробормотал я. — Мне очень лестно… Вероятно, я так или иначе научился чему-то от вас…

Он отрицательно покачал головой.

— Mais поп, ce n'est pas ca¹. Вы ничему не научились.

— Как? — изумленно спросил я.

— Не удивляйтесь. Все правильно. Никто ни у кого не должен учиться. Каждый человек должен развивать до предела свои возможности, а не копировать кого-то другого. Я не хочу, чтобы вы стали ухудшенным Пуаро. Я хочу, чтобы вы были непревзойденным Гастингсом! Впрочем, вы и есть непревзойденный Гастингс. Вы классически, совершенно нормальны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

какая разница компилятору. в чем его трудности. это не одно и то же?

Как откровенничал когда-то (кажется) zltigo: одно дело - стандарт, и немного другое дело - секретные инструкции компиляторописателям.

Жаль, таких зачотных бесед уже давно не наблюдается.

 

Если бы была очевидна и проста однозначность толкования при разборе текста, (без опережающего анализа, возвратов и прочих излишеств, которых не было в ранних компиляторах), то наиболее вероятно, что так и сделали бы. А потом большой вес уже приобретала обратная совместимость.

 

Представьте:

Допустим указатель был на структуру1, в которой первым членом идёт структура2. Компилятор, спускаясь/шагая по дереву/структуре опознанного типа, при заполнении содержимого типа <указатель на структуру1> увидев две открывающиеся фигурные скобки без какого-либо подвоха подумает, что вторая скобка есть вход в структуру2. А Jenya7 будет думать, что он первой скобкой создаёт массив структур1, а после второй заполняет первый член структуры1. Можно предположить, что во избежание гемороя/неоднозначностей, первая скобка, при указателе на структуру/юнион трактуется как начало данных этой структуры/юниона. А не гадание на кофейной гуще - захотел ли кодописатель организовать массив и сколько в этом массиве измерений (не элементов!). А может быть ещё и не раз захотел, в подуровнях членов. И полный вынос мозга: массив указателей на массив указателей на массив с типом любых чисел. Компилятор, где-то после 3-ей открытой скобки встретит 0 и не поймёт, что это: нулевой указатель или край иерархии - значение с типом любого числа. Плюс к этому, блок данных (между фигурными скобками) не обязательно заполнять до конца. Можно сразу после нуля поставить закрывающую скобку.

 

Имхо, самый близкий к желаемому вариант был в 10-ом посте. Грех жаловаться.

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...