|
|
|
Инициализация структуры |
|
|
|
Jul 20 2018, 12:25
|
Профессионал
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075
|
Хотел немного схитрить, ну так, с краешку. Создал структуру Код 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 - Jul 20 2018, 12:25
|
|
|
|
|
Jul 20 2018, 12:32
|
Местный
Группа: Участник
Сообщений: 319
Регистрация: 27-09-07
Пользователь №: 30 877
|
Цитата(Jenya7 @ Jul 20 2018, 15:25) Не хочет видеть как указатель на массив. Все так плохо или можно что то сделать? все имено так плохо делайте { {0, "SUBMENU1" }, { 1, "SUBMENU2" }, { 2, "SUBMENU3" } } - отдельной константой. код станет чуть менее красивым, но по моему - не сильно ухудшится. терпимо будет.
Сообщение отредактировал AlexRayne - Jul 20 2018, 12:32
|
|
|
|
|
Jul 20 2018, 12:38
|
Профессионал
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075
|
Цитата(AlexRayne @ Jul 20 2018, 18:32) все имено так плохо делайте { {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 - Jul 20 2018, 13:31
|
|
|
|
|
Jul 20 2018, 14:14
|
Местный
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264
|
Цитата(Jenya7 @ Jul 20 2018, 16:25) причем если убираю скобки ругается на уровне ошибки. Как Вы собираетесь объявить массив, содержащий указатель на объект, который еще не объявлен? Вот и весь ответ на вопрос о возможности так схитрить. Код 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; }
|
|
|
|
|
Jul 20 2018, 15:32
|
Местный
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264
|
Цитата(Jenya7 @ Jul 20 2018, 18:21) Но инициализируя я же его объявляю. я передаю реальные адреса. Да ну? Где это Вы реальные адреса там передаете, не подскажете? Цитата(Jenya7 @ Jul 20 2018, 18:21) получается промежуточный массив. а что компилятор не достаточно умный чтоб сделать подстановку? Какой еще промежуточный массив? Компилятор не достаточно умный? Где-то я подобное смелое утверждение слышал уже. И вроде от Вас
|
|
|
|
|
Jul 20 2018, 18:33
|
Профессионал
Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226
|
Всё будет во флэш, инициализация не нужна. Код 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 } };
|
|
|
|
|
Jul 21 2018, 05:41
|
Профессионал
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075
|
Цитата(x893 @ Jul 21 2018, 00:33) Всё будет во флэш, инициализация не нужна. Код 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" } } }, какая разница компилятору. в чем его трудности. это не одно и то же?
|
|
|
|
|
Jul 23 2018, 12:33
|
Гуру
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847
|
Janya7 - вы случайно не состоите в родстве с Гастингсом? Цитата — Ну что вы, Пуаро, — пробормотал я. — Мне очень лестно… Вероятно, я так или иначе научился чему-то от вас… Он отрицательно покачал головой. — Mais поп, ce n'est pas ca¹. Вы ничему не научились. — Как? — изумленно спросил я. — Не удивляйтесь. Все правильно. Никто ни у кого не должен учиться. Каждый человек должен развивать до предела свои возможности, а не копировать кого-то другого. Я не хочу, чтобы вы стали ухудшенным Пуаро. Я хочу, чтобы вы были непревзойденным Гастингсом! Впрочем, вы и есть непревзойденный Гастингс. Вы классически, совершенно нормальны.
|
|
|
|
|
Jul 23 2018, 23:32
|
.
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753
|
Цитата(Jenya7 @ Jul 21 2018, 09:41) какая разница компилятору. в чем его трудности. это не одно и то же? Как откровенничал когда-то (кажется) zltigo: одно дело - стандарт, и немного другое дело - секретные инструкции компиляторописателям. Жаль, таких зачотных бесед уже давно не наблюдается. Если бы была очевидна и проста однозначность толкования при разборе текста, (без опережающего анализа, возвратов и прочих излишеств, которых не было в ранних компиляторах), то наиболее вероятно, что так и сделали бы. А потом большой вес уже приобретала обратная совместимость. Представьте: Допустим указатель был на структуру1, в которой первым членом идёт структура2. Компилятор, спускаясь/шагая по дереву/структуре опознанного типа, при заполнении содержимого типа <указатель на структуру1> увидев две открывающиеся фигурные скобки без какого-либо подвоха подумает, что вторая скобка есть вход в структуру2. А Jenya7 будет думать, что он первой скобкой создаёт массив структур1, а после второй заполняет первый член структуры1. Можно предположить, что во избежание гемороя/неоднозначностей, первая скобка, при указателе на структуру/юнион трактуется как начало данных этой структуры/юниона. А не гадание на кофейной гуще - захотел ли кодописатель организовать массив и сколько в этом массиве измерений (не элементов!). А может быть ещё и не раз захотел, в подуровнях членов. И полный вынос мозга: массив указателей на массив указателей на массив с типом любых чисел. Компилятор, где-то после 3-ей открытой скобки встретит 0 и не поймёт, что это: нулевой указатель или край иерархии - значение с типом любого числа. Плюс к этому, блок данных (между фигурными скобками) не обязательно заполнять до конца. Можно сразу после нуля поставить закрывающую скобку. Имхо, самый близкий к желаемому вариант был в 10-ом посте. Грех жаловаться.
Сообщение отредактировал GetSmart - Jul 24 2018, 18:13
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|