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

 
 
> Инициализация структуры
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
 
Start new topic
Ответов
GetSmart
сообщение Jul 28 2018, 15:36
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



+5 копеек:
индексация указателя не контролирует индекс, а индексация (имени) массива будет, при возможности, проверять индекс на допустимый диапазон.

ЗЫ
Кстати, index[array] какой-то обкуренный товарищ придумал. Любопытно было бы узнать исторические предпосылки или адекватную логическую аргументацию этого кошмара. (а не тупой отсыл к тексту стандарта, в котором не обязана быть аргументация)

Хотелось бы удостовериться, что все интуитивно непонятные места в Си существуют для обхода (старых и новых) граблей или для увеличения концентрации смысла на еденицу текста. Но с минимизацией ущерба общекомпьютерным категориям и терминам, которыми мыслят и на которых общаются разработчики, например, широкого профиля.

Сообщение отредактировал GetSmart - Jul 28 2018, 17:22


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jul 29 2018, 00:25
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(GetSmart @ Jul 28 2018, 18:36) *
Кстати, index[array] какой-то обкуренный товарищ придумал. Любопытно было бы узнать исторические предпосылки или адекватную логическую аргументацию этого кошмара. (а не тупой отсыл к тексту стандарта, в котором не обязана быть аргументация)

Не обкуренный товарищ, а группа обкуренных товарищей (WG14). "6.5.2.1 Array subscripting".
Из второго пункта: "The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2)))."
И далее объяснение - потому что "E1 is an array object (equivalently, a pointer to the initial element of an array object)".

Для примера с sizeof: "6.5.3.4 The sizeof and _Alignof operators", разъясняет, что от sizeof(E1) не стоит ожидать физического размера указателя ибо
sizeof "yields the size of the adjusted (pointer) type".
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 29 2018, 05:43
Сообщение #4


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(aiwa @ Jul 29 2018, 04:25) *
Из второго пункта: "The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2)))."

Явно не обозначена аргументация, зачем превращать (классическую) индексацию массива в выражение со сложением. И чем не понравился вариант, когда два (три) оператора (+/-, []) могут быть применимы к массиву. Не обозначены веские причины для того, чтобы массив стал исключением из общих правил нисходящего перемещения по агрегатным типам, когда в тексте левая часть выражения указывает на более массивный агрегатный тип. При этом массивный агр. тип является источником имён и прочей инфы для нисхождения. Для массива это правило интуитивно оптимально при обращениях к многомерным массивам. Здесь же "E1[E2] is identical to (*((E1)+(E2)))" контроль диапазонов многомерия либо невозможен, либо возможен только контроль суммарного размера массива. Плюс, все операторы ".", "->" являются ассиметричными к операндам, аналогично "[]" в большинстве ЯП, изучаемых в образовательных учреждениях. Это правило делает и работу компилятора и читабельность текста проще.

С таким стандартом руки чешутся писать E1[E2]E3[E4] и прочую ерунду. Опять же, ++E1[E2] , где E2 - массив, E1 - integer lvalue, - выносит мозг конкретно. Хочется инкрементнуть элемент массива, но читается по естественным правилам это как увеличение индекса. Плюс: E1++[E2]++. Если ещё покопать, то можно мумию Тутанхамона выкопать.

Сообщение отредактировал GetSmart - Jul 29 2018, 20:30


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jul 29 2018, 07:14
Сообщение #5


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

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(GetSmart @ Jul 29 2018, 08:43) *
Плюс, все операторы ".", "->" являются ассиметричными к операндам, аналогично "[]" в большинстве ЯП, изучаемых в образовательных учреждениях. Это правило делает и работу компилятора и читабельность текста проще.
Когда содавался язык Си, никаких
Цитата
ЯП, изучаемых в образовательных учреждениях
не было.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 2 2018, 02:41
Сообщение #6


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(andrew_b @ Jul 29 2018, 11:14) *
Когда содавался язык Си, никаких {ЯП, изучаемых в образовательных учреждениях} не было.

Да, но тогда переформулируя, в большинстве ЯП высокого уровня того времени.

----------------
Как сказал один мой необкуренный коллега: Что-то у вас тут недоработано ©

Ещё, надеюсь, в стандарте кто-нибудь догадался однозначно указать, что в разделе кода точка с запятой после закрытия непустого блока (}) выражением не считается. (из-за которого предыдущие IF потеряют возможность иметь ELSE)

Upd. И это, разумеется, не касается блока инициализатора. Ещё лучше так: ... указать, что точка с запятой, интерпретируемая первым оператором после закрытия непустого блока кода (закр. фиг. скобки), - выражением не считается.

Отпуск на носу. Отложу раскопки на потом.

Сообщение отредактировал GetSmart - Aug 2 2018, 13:32


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 2 2018, 12:04
Сообщение #7


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Там немного обновил.

Отвечу так: одной из важнейших целей правил является компактность и ясность программы. Если это требует маленького исключения/особенности, то ничего плохого в этом нет. Которые там и так есть. Это точно менее кошмарно, чем index[array] и мутный do {...} while (0) в макросе. Кроме того, предельная простота совсем не гарантирует однозначности (толкования).


Цитата(aiwa @ Jul 29 2018, 12:38) *
По сути "E1[E2] is identical to (*((E1)+(E2)))" - это лишь выражение идеи. Для полной идентичности целое E2 должно быть умножено на типоразмер E1.
Идея состоит в том, что имя массива страдает дуализмом: оно указывает на первый элемент массива но не является указателем в нормативном смысле.
Отсюда естественно вытекает определение многомерных массивов: показывает на элемент, который является массив меньшей размерности.
Поэтому контроль диапазонов вполне возможен и, в принципе, легко реализуем, но, к всеобщему счастью, априори не предусмотрен в С.

Подскажите тогда, какой тип будут иметь вполне корректные выражения: (при E2=array, E1=index, для одномерного и многомерного массивов)
1: ((E1)+(E2))
2: ((E1)+(E2)+5)
3: ((E1)+5+(E2))
И, если можете, дайте определение/цитату или ссыль на упомянутый термин <типоразмер E1> в тексте <целое E2 должно быть умножено на типоразмер E1>. Это размер элемента ниже по иерархии от имени или размер элемента "на самом дне массива"? Или даже размер целого массива, на который указывает имя? (<типоразмер short> я буквально понимаю как 2 байта {например в Keil for ARMv4..ARMv7}. Типоразмер E5, где E5=структура, я склонен толковать как размер всей структуры, и по этой причине типоразмер E1 (ака массива) - как всего массива целиком. Для версии <имя массива в какой-то мере адрес> считать типоразмером E1 размер адреса - в обсуждаемом контексте вообще маловероятно).

Сообщение отредактировал GetSmart - Aug 2 2018, 14:03


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
aiwa
сообщение Aug 2 2018, 14:00
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(GetSmart @ Aug 2 2018, 15:04) *
Подскажите тогда, какой тип будут иметь вполне корректные выражения: (при E2=array, E1=index, для одномерного и многомерного массивов)
1: ((E1)+(E2))
2: ((E1)+(E2)+5)
3: ((E1)+5+(E2))


1. указатель на E1-й элемент массива E2.
2. и 3. указатель на (E1+5)-й элемент массива E2.

В случае многомерности E2 элементом будет выступать массив размерности меньшей на единицу, чем E2 .

Когда я говорил про типоразмеры я имел ввиду упомянутые выше ассемблерные команды.
Компилятор С сложение в этих выражениях понимает в смысле арифметики указателей и все получается корректным.



Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 2 2018, 14:17
Сообщение #9


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(aiwa @ Aug 2 2018, 18:00) *
1. указатель на E1-й элемент массива E2.
2. и 3. указатель на (E1+5)-й элемент массива E2.

В случае многомерности E2 элементом будет выступать массив размерности меньшей на единицу, чем E2 .

В стандарте пример подобный описан или какие-то комментарии разработчиков прилагаются?

Мне непонятно, для массива определены особые правила вычисления выражений? По стандартным/общим правилам для варианта 2 будет сперва выполнено (E1)+(E2) и результатом будет (как заявлено в цитате из стандарта) - адрес элемента массива. При многомерном массиве - адрес массива <размерности меньшей на единицу, чем E2>. И уже когда к этому аргументу будет приплюсовываться число 5, то оно, проще говоря, должно быть (наиболее вероятно по вышеобозначенной инфе) индексом следующей (второй) размерности. Однако, если массив одномерный, то добавление числа к адресу, указывающему не на массив, истолкуется как добавление числа к указателю такого типа. И результат для одномерного массива будет действительно похож на <2. и 3. указатель на (E1+5)-й элемент массива E2.>

Сообщение отредактировал GetSmart - Aug 2 2018, 14:55


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

Сообщений в этой теме
- Jenya7   Инициализация структуры   Jul 20 2018, 12:25
- - AlexRayne   Цитата(Jenya7 @ Jul 20 2018, 15:25) Не хо...   Jul 20 2018, 12:32
|- - Jenya7   Цитата(AlexRayne @ Jul 20 2018, 18:32) вс...   Jul 20 2018, 12:38
- - jcxz   Цитата(Jenya7 @ Jul 20 2018, 15:25) КодME...   Jul 20 2018, 13:57
- - Arlleex   Цитата(Jenya7 @ Jul 20 2018, 16:25) приче...   Jul 20 2018, 14:14
|- - Jenya7   Цитата(Arlleex @ Jul 20 2018, 20:14) Как ...   Jul 20 2018, 15:21
|- - Arlleex   Цитата(Jenya7 @ Jul 20 2018, 18:21) Но ин...   Jul 20 2018, 15:32
- - krux   динамика.... в меню.... наибессмысленнейшее решени...   Jul 20 2018, 17:00
- - Serge V Iz   Попробуйте встать на место компилятора. Инициализа...   Jul 20 2018, 18:03
- - x893   Всё будет во флэш, инициализация не нужна. Кодtype...   Jul 20 2018, 18:33
|- - Jenya7   Цитата(x893 @ Jul 21 2018, 00:33) Всё буд...   Jul 21 2018, 05:41
|- - jcxz   Цитата(Jenya7 @ Jul 21 2018, 08:41) какая...   Jul 21 2018, 09:05
|- - GetSmart   Цитата(Jenya7 @ Jul 21 2018, 09:41) какая...   Jul 23 2018, 23:32
|- - XVR   Цитата(Jenya7 @ Jul 21 2018, 08:41) какая...   Jul 24 2018, 07:49
|- - aiwa   Цитата(XVR @ Jul 24 2018, 10:49) Вопреки ...   Jul 26 2018, 09:16
|- - Arlleex   Это все известные вещи. Но, как было правильно отм...   Jul 26 2018, 10:35
|- - XVR   Цитата(aiwa @ Jul 26 2018, 12:16) Почему ...   Jul 26 2018, 12:32
|- - aiwa   Цитата(XVR @ Jul 26 2018, 15:32) Потому ч...   Jul 27 2018, 09:09
|- - XVR   Цитата(aiwa @ Jul 27 2018, 12:09) Никаког...   Jul 27 2018, 09:19
- - x893   Это надо у компилятора спрашивать.   Jul 21 2018, 06:08
- - XVR   Janya7 - вы случайно не состоите в родстве с Гасти...   Jul 23 2018, 12:33
- - GetSmart   Апосля подумалось. Идея смысла текста топикстартер...   Jul 26 2018, 01:22
|- - jcxz   Цитата(GetSmart @ Jul 26 2018, 04:22) В с...   Jul 26 2018, 08:21
|- - AlexRayne   Цитата(GetSmart @ Jul 26 2018, 04:22) А и...   Jul 26 2018, 09:16
|- - andrew_b   Цитата(AlexRayne @ Jul 26 2018, 12:16) в ...   Jul 26 2018, 10:54
|- - Arlleex   Цитата(AlexRayne @ Jul 26 2018, 13:16) в ...   Jul 26 2018, 11:03
|- - Arlleex   Цитата(GetSmart @ Jul 28 2018, 18:36) +5 ...   Jul 28 2018, 16:51
||- - GetSmart   Цитата(Arlleex @ Jul 28 2018, 20:51) А фо...   Jul 28 2018, 17:01
||- - andrew_b   Цитата(GetSmart @ Aug 2 2018, 05:41) Да, ...   Aug 2 2018, 04:51
|||- - GetSmart   Цитата(andrew_b @ Aug 2 2018, 08:51) А с ...   Aug 2 2018, 05:39
|||- - andrew_b   При чём тут непустой блок? Пустой оператор -- это ...   Aug 2 2018, 06:53
|||- - aiwa   Цитата(GetSmart @ Aug 2 2018, 17:17) Мне ...   Aug 2 2018, 14:50
|||- - GetSmart   Цитата(aiwa @ Aug 2 2018, 18:50) Так все ...   Aug 2 2018, 15:00
|||- - aiwa   Цитата(GetSmart @ Aug 2 2018, 18:00) В вы...   Aug 2 2018, 15:53
|||- - GetSmart   Цитата(aiwa @ Aug 2 2018, 19:53) В станда...   Aug 2 2018, 16:49
|||- - andrew_b   Цитата(GetSmart @ Aug 2 2018, 19:49) Туда...   Aug 3 2018, 05:01
|||- - aiwa   Цитата(GetSmart @ Aug 2 2018, 19:49) Слож...   Aug 3 2018, 09:32
|||- - GetSmart   Цитата(aiwa @ Aug 3 2018, 13:32) Не путай...   Aug 3 2018, 12:09
|||- - aiwa   Цитата(GetSmart @ Aug 3 2018, 15:09) ...Е...   Aug 3 2018, 12:57
|||- - GetSmart   Цитата(aiwa @ Aug 3 2018, 16:57) В оригин...   Aug 3 2018, 13:58
|||- - aiwa   Цитата(GetSmart @ Aug 3 2018, 16:58) В ко...   Aug 3 2018, 14:31
||- - GetSmart   ЦитатаНу да, отвлекся и написал для массива 4x4, п...   Aug 3 2018, 17:45
||- - aiwa   Цитата(GetSmart @ Aug 3 2018, 20:45) inde...   Aug 4 2018, 08:09
||- - GetSmart   Цитата(aiwa @ Aug 4 2018, 12:09) Но почем...   Aug 5 2018, 02:46
|- - aiwa   Цитата(GetSmart @ Jul 29 2018, 08:43) Явн...   Jul 29 2018, 08:38
- - GetSmart   Я пару раз добавил в конец предыдущих постов одно ...   Aug 3 2018, 06:25
- - GetSmart   В стандарте есть явные определения логики интерпре...   Aug 3 2018, 14:54
|- - aiwa   Цитата(GetSmart @ Aug 3 2018, 17:54) В ст...   Aug 3 2018, 15:14
- - XVR   Пошла 4 страница трёпа вокруг массива/указателя......   Aug 4 2018, 16:33
- - aiwa   Цитата(GetSmart @ Aug 5 2018, 05:46) Но у...   Aug 8 2018, 20:53
|- - Herz   Цитата(aiwa @ Aug 8 2018, 23:53) Так букв...   Aug 9 2018, 08:20
- - Arlleex   Действительно какая-то пьянка вокруг массива и ука...   Aug 9 2018, 04:54


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

 


RSS Текстовая версия Сейчас: 17th June 2025 - 16:33
Рейтинг@Mail.ru


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