реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Инициализация структуры
Jenya7
сообщение Jul 20 2018, 12:25
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
AlexRayne
сообщение Jul 20 2018, 12:32
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 27-09-07
Пользователь №: 30 877



Цитата(Jenya7 @ Jul 20 2018, 15:25) *
Не хочет видеть как указатель на массив. Все так плохо или можно что то сделать?

все имено так плохо
делайте { {0, "SUBMENU1" }, { 1, "SUBMENU2" }, { 2, "SUBMENU3" } } - отдельной константой.
код станет чуть менее красивым, но по моему - не сильно ухудшится. терпимо будет.


Сообщение отредактировал AlexRayne - Jul 20 2018, 12:32
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 20 2018, 12:38
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 20 2018, 13:57
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Jul 20 2018, 15:25) *
Код
MENU menu[] =
{
    {  { 1, "MENU1"},
       { {0, "SUBMENU1" }, { 1, "SUBMENU2" }, { 2, "SUBMENU3" } }
    }
};

И на кой на это тратить ОЗУ??? wacko.gif
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jul 20 2018, 14:14
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 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;
}
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 20 2018, 15:21
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Arlleex @ Jul 20 2018, 20:14) *
Как Вы собираетесь объявить массив, содержащий указатель на объект, который еще не объявлен? Вот и весь ответ на вопрос о возможности так схитрить.
Но инициализируя я же его объявляю. я передаю реальные адреса.

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

Сообщение отредактировал Jenya7 - Jul 20 2018, 15:24
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jul 20 2018, 15:32
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(Jenya7 @ Jul 20 2018, 18:21) *
Но инициализируя я же его объявляю. я передаю реальные адреса.

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

Цитата(Jenya7 @ Jul 20 2018, 18:21) *
получается промежуточный массив. а что компилятор не достаточно умный чтоб сделать подстановку?

Какой еще промежуточный массив? Компилятор не достаточно умный? Где-то я подобное смелое утверждение слышал уже. И вроде от Вас biggrin.gif
Go to the top of the page
 
+Quote Post
krux
сообщение Jul 20 2018, 17:00
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596



динамика....
в меню....
наибессмысленнейшее решение.

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


--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
Go to the top of the page
 
+Quote Post
Serge V Iz
сообщение Jul 20 2018, 18:03
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 3-05-18
Пользователь №: 103 639



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

В записи просто недостаточно информации, чтобы вывести тип. Компилятор не сможет корректно такое обработать )
Go to the top of the page
 
+Quote Post
x893
сообщение Jul 20 2018, 18:33
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 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 }
};
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 21 2018, 05:41
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 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" } } },

какая разница компилятору. в чем его трудности. это не одно и то же?
Go to the top of the page
 
+Quote Post
x893
сообщение Jul 21 2018, 06:08
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Это надо у компилятора спрашивать.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 21 2018, 09:05
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Jul 21 2018, 08:41) *
какая разница компилятору. в чем его трудности. это не одно и то же?

Я думаю у него трудностей нет, только у вас. Так как не он пишет в форум, а вы. biggrin.gif
Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 23 2018, 12:33
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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

Цитата
— Ну что вы, Пуаро, — пробормотал я. — Мне очень лестно… Вероятно, я так или иначе научился чему-то от вас…
Он отрицательно покачал головой.
— Mais поп, ce n'est pas ca¹. Вы ничему не научились.
— Как? — изумленно спросил я.
— Не удивляйтесь. Все правильно. Никто ни у кого не должен учиться. Каждый человек должен развивать до предела свои возможности, а не копировать кого-то другого. Я не хочу, чтобы вы стали ухудшенным Пуаро. Я хочу, чтобы вы были непревзойденным Гастингсом! Впрочем, вы и есть непревзойденный Гастингс. Вы классически, совершенно нормальны.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 23 2018, 23:32
Сообщение #15


.
******

Группа: Участник
Сообщений: 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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th April 2024 - 07:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01515 секунд с 7
ELECTRONIX ©2004-2016