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

|
Цитата Ну да, отвлекся и написал для массива 4x4, правильно было бы а[0][24] и a[24][0]. Но не важно, - главное, что коммутативность арифметики с указателем приводит к такому побочному эффекту. Это по шагам можете объяснить? Мне понятны варианты когда а[0][24] идентичен a[1][19] и идентичен a[2][14] и т.д. Если не обращать внимание на варнинги компилятора. Но a[24][0] каким образом-то? Цитата(aiwa @ Aug 2 2018, 18:00)  2. и 3. указатель на (E1+5)-й элемент массива E2. index1[index2][array_name] и index1[index2][index3][array_name] тоже разрешены? Если да, исходя из каких формулировок? Цитата(aiwa @ Aug 3 2018, 19:14)  Нет. Оператор [] значится как postfix-operator и определен для "array subscripting". Это признак массива. То есть разрешение применения [] к любому указателю на непустой тип даёт именно первый абзац главы <6.5.2.1 Array subscripting> ? object type определён как любой, за исключением void? В стандарте есть суммарный раздел об авто-преобразованиях? Или надо шерстить весь стандарт чтобы откопать однозначность? Видимо отсюда и растут ноги у названия "подписка". Страннейшего, для необкуренных мозгов. Обозвали бы "индексация" и уловка с авто-подменой была бы недоступна. В посте 40 я ошибся, в цитате: <И уже когда к этому аргументу будет приплюсовываться число 5, то оно, проще говоря, должно быть (наиболее вероятно по вышеобозначенной инфе) индексом следующей (второй) размерности.> т.к. на следующую размерность не перейти, без применения оператора * в вариантах со сложением. Цитата(aiwa) "Почти всегда" следует потому в случае оператора sizeof, согласно которому имя_массива преобразуется в тип "массив заданной размерности", в остальных случаях имя_массива преобразуется в &имя_массива[0]. Ну бред же. Для компилятора имя массива - это lvalue (кратко - объект в памяти). К нему можно применить амперсанд. &имя_массива[0] - это rvalue, к нему (здесь будет второй раз) амперсанд не применим. И для (простейше определённого) многомерного массива array_name[0] есть тоже lvalue. А, согласно этой цитаты, выражение &(array_name[0]) давало бы ошибку. Т.к. выражение в скобках, являющееся массивом авто-преобразовывалось бы в указатель. Хотя, корректней писать в <rvalue-указатель>. Всё это потверждает, что и rvalue с типом указатель на массив и lvalue с типом массив существуют без всякого sizeof, в них определена характеристика размера (для размерных), компиляторы поступают вполне разумно её проверяя на этапе компиляции, а что мешает копировать массивы выражениями вроде a=b - непонятно. В языке должна быть ясность очерёдности исполнения авто-преобразований и операторов. Например: авто-преобразования применяются компилятором в самый последний момент исполнения операторов. И не должны менять приоритеты операторов при определении очерёдности их исполнения. Хотя, с таким неполным стандартом, если по нему ясность поведения будет не определена, то, наверное, судить придётся по каким-то ещё документам, например от выдумщика языка. А то появится несогласующийся с ранее написанными правилами футбол между операторами, операндами и авто-преобразованиями. (в этой ветке я ранее писал аргументов, но терминологически точнее, видимо, операндов для операторов и аргументов/параметров для функций) Пытаясь как-то оправдать логику выдумщика и потом стандарта, когда на начальном этапе массив (array object по терминологии главы 6.5.2.1) казался избыточным и работу с массивами НАДО БЫЛО организовывать через указатели и операторы +-, которым был непринципиален порядок разношёрстных операндов, мне самому любопытно, на какой развилке не туда свернули))) Упд. Именно такая историческая цепь прослеживается при чтении стандарта, когда оператор [] определяется текстовым примером через ранее определённые выражения.
Сообщение отредактировал GetSmart - Aug 4 2018, 07:40
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 4 2018, 08:09
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(GetSmart @ Aug 3 2018, 20:45)  index1[index2][array_name] и index1[index2][index3][array_name] тоже разрешены? Если да, исходя из каких формулировок? Согласно 1-му пункту "подписки" это нелегально. Потому что в части выражения "index1[index2]..." один из этих индексов должен быть "pointer..." Цитата(GetSmart @ Aug 3 2018, 20:45)  Это по шагам можете объяснить? Мне понятны варианты когда а[0][24] идентичен a[1][19] и идентичен a[2][14] и т.д. Если не обращать внимание на варнинги компилятора. Но a[24][0] каким образом-то? Если по шагам, то этот пример я хотел привести намного раньше, когда Вы в ((E1)+(E2)+5) предлагали видеть в 5-ке индекс второй размерности. Но я ошибочно начал тавтологию про типоразмеры. Но так как мне показалось, что мы толчем воду я его и привел с опозданием. Вы правы, если продолжить ряд , то должны прийти к правильному решению похожему на a[24][-64]. Или сразу применить формулу, по которой добавляя число к первому индексу, мы должны отнимать это число, умноженное на 5 от второго. 5 и выступает в качестве типоразмера. Имхо, пример хорошо иллюстрирует рекурсивность правила для многомерных массивов. Цитата(GetSmart @ Aug 3 2018, 20:45)  То есть разрешение применения [] к любому указателю на непустой тип даёт именно первый абзац главы <6.5.2.1 Array subscripting> ? object type определён как юбой, за исключением void? В стандарте есть суммарный раздел об авто-преобразованиях? Или надо шерстить весь стандарт чтобы откопать однозначность? Я не знаю стандарт достаточно хорошо. Помню в свое время всем отделом шерстили именно по указанной теме. Но похоже, что действует принцип: "разрешено все, что не запрещено". Поэтому использование "подписки" для указателя вполне законно. Только я не уверен, что термин в стандарте эквивалентен нашему пониманию "подписки". Цитата(GetSmart @ Aug 3 2018, 20:45)  Ну бред же. Для компилятора имя массива - это lvalue (кратко - объект в памяти). К нему можно применить амперсанд. &имя_массива[0] - это rvalue, к нему (здесь будет второй раз) амперсанд не применим. И для (простейше определённого) многомерного массива array_name[0] есть тоже lvalue. Ну я условно, для краткости, чтобы не писать присутствующее в каждом посте "pointer to....". Цитата(GetSmart @ Aug 3 2018, 20:45)  Пытаясь как-то оправдать логику выдумщика и потом стандарта, когда на начальном этапе массив (array object по терминологии главы 6.5.2.1) казался избыточным и работу с массивами НАДО БЫЛО организовывать через указатели и операторы +-, которым был непринципиален порядок разношёрстных операндов, мне самому любопытно, на какой развилке не туда свернули))) Но почему Вы считаете, что они свернули не туда? Они реализовали "ассемблерные возможности" на высоком уровне. И это есть хорошо. И не дай бог они повернут туда: зачем нам третья java, или четвертый шарп?
Сообщение отредактировал aiwa - Aug 4 2018, 08:09
|
|
|
|
|
Aug 5 2018, 02:46
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(aiwa @ Aug 4 2018, 12:09)  Но почему Вы считаете, что они свернули не туда? Как буд-то родился "кошмар на улице си" index[array]. Не прочитав всю кучу документов точно и не разберёшься. Полноценный перевод этого мутного термина я не знаю. В каких-то словарях компьютерных терминов его кастрируют до <индексация>. Но в общеупотребительном смысле это слово более многогранное. Со смыслами <одобрить>, <согласиться>. Пока (если лучше версию не увижу), наверное буду считать в Си "признать массивом и индексировать". Но у буржуев есть какой-то схожий термин "superscripting" (superscription-надпись, в общеупотребительном аглицком), которе вместе (теоретически наверно) могут как-то обозначать вариации индексаций "вглубь" (для массивов) или наружу (для указателей). Но с такими тонкостями толкования я пока не пересекался. Мутность такая же, как при переводе термина bitwise (complement), о котором когда-то спорили.
Сообщение отредактировал GetSmart - Aug 5 2018, 06:13
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
Сообщений в этой теме
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       GetSmart Цитата(aiwa @ Aug 2 2018, 18:00) 1. указа... Aug 2 2018, 14:17        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   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
|
|
|