|
Инициализация структуры |
|
|
|
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 28 2018, 15:36
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
+5 копеек: индексация указателя не контролирует индекс, а индексация (имени) массива будет, при возможности, проверять индекс на допустимый диапазон.
ЗЫ Кстати, index[array] какой-то обкуренный товарищ придумал. Любопытно было бы узнать исторические предпосылки или адекватную логическую аргументацию этого кошмара. (а не тупой отсыл к тексту стандарта, в котором не обязана быть аргументация)
Хотелось бы удостовериться, что все интуитивно непонятные места в Си существуют для обхода (старых и новых) граблей или для увеличения концентрации смысла на еденицу текста. Но с минимизацией ущерба общекомпьютерным категориям и терминам, которыми мыслят и на которых общаются разработчики, например, широкого профиля.
Сообщение отредактировал GetSmart - Jul 28 2018, 17:22
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 29 2018, 00:25
|
Местный
  
Группа: Участник
Сообщений: 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".
|
|
|
|
|
Jul 29 2018, 05:43
|
.
     
Группа: Участник
Сообщений: 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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 29 2018, 07:14
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(GetSmart @ Jul 29 2018, 08:43)  Плюс, все операторы ".", "->" являются ассиметричными к операндам, аналогично "[]" в большинстве ЯП, изучаемых в образовательных учреждениях. Это правило делает и работу компилятора и читабельность текста проще. Когда содавался язык Си, никаких Цитата ЯП, изучаемых в образовательных учреждениях не было.
|
|
|
|
|
Aug 2 2018, 02:41
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(andrew_b @ Jul 29 2018, 11:14)  Когда содавался язык Си, никаких {ЯП, изучаемых в образовательных учреждениях} не было. Да, но тогда переформулируя, в большинстве ЯП высокого уровня того времени. ---------------- Как сказал один мой необкуренный коллега: Что-то у вас тут недоработано © Ещё, надеюсь, в стандарте кто-нибудь догадался однозначно указать, что в разделе кода точка с запятой после закрытия непустого блока (}) выражением не считается. (из-за которого предыдущие IF потеряют возможность иметь ELSE) Upd. И это, разумеется, не касается блока инициализатора. Ещё лучше так: ... указать, что точка с запятой, интерпретируемая первым оператором после закрытия непустого блока кода (закр. фиг. скобки), - выражением не считается. Отпуск на носу. Отложу раскопки на потом.
Сообщение отредактировал GetSmart - Aug 2 2018, 13:32
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 2 2018, 12:04
|
.
     
Группа: Участник
Сообщений: 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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 2 2018, 14:00
|
Местный
  
Группа: Участник
Сообщений: 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 . Когда я говорил про типоразмеры я имел ввиду упомянутые выше ассемблерные команды. Компилятор С сложение в этих выражениях понимает в смысле арифметики указателей и все получается корректным.
|
|
|
|
|
Aug 2 2018, 14:17
|
.
     
Группа: Участник
Сообщений: 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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|