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

 
 
> Инициализация структуры
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
aiwa
сообщение Aug 2 2018, 14:50
Сообщение #10


Местный
***

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



Цитата(GetSmart @ Aug 2 2018, 17:17) *
Мне непонятно, для массива определены особые правила вычисления выражений? По стандартным/общим правилам для варианта 2 будет сперва выполнено (E1)+(E2) и ....


Так все это E2+E1 и подобные выражения не являются исходным для применения правил, они лишь объясняют использование "array subscripting".

Грубо говоря, они помогают понимать как компилятор должен обходиться с выражениями вида expr1[expr2] и подобными.

Если E2 - многомерный массив, например E2[10][20][30][40][50]
2. и 3. варианты подходят к случаю E2[E1+5], результатом которого будет (E1+5)-й подмассив типа ()[20][30][40][50];
Для E2[E1][5] выражение будет композицией вышеупомянутого правила: сначала получается из "E2[E1]" (E1)-й подмассив типа ()[20][30][40][50] - грубо говоря к адресу E2 прибавляется E1*типоразмер ()[20][30][40][50], и затем к полученному результату правило применяют повторно для [5] - здесь уже арифметика указателей должна прибавлять пять типоразмеров меньшей размерности ()[30][40][50].

Под типразмером я имею ввиду физический размер с учетом выравнивания.

В стандарте, наверное, нет никаких типоразмеров, он оперирует "элементами массива", вводя многомерность по рекурсии.






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


.
******

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



Цитата(aiwa @ Aug 2 2018, 18:50) *
Так все это E2+E1 и подобные выражения не являются исходным для применения правил, они лишь объясняют использование "array subscripting".

Грубо говоря, они помогают понимать как компилятор должен обходиться с выражениями вида expr1[expr2] и подобными.

В вышеобсуждаемой цитата из стандарта явно указано, что такое выражение разрешено стандартом (сложение чисел с именем массива). При неуказании особых правил этого "изврата" применяются стандартные правила приоритетов и ассоциативности. Без оговорок и комментариев на уровне стандарта иначе это нельзя истолковать.


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

<Адрес> точнее будет заменить на <что-то> (неуказанное в стандарте), содержащее адрес, указывающий на вышеобозначенный тип. (пример: <сперва выполнено (E1)+(E2) и результатом будет {как заявлено в цитате из стандарта} - адрес элемента массива.> ==> <что-то> с адресом элемента массива) И к этому <что-то> применим оператор *. К указателю он тоже применим, но их идентичность это не доказывает, без документального подтверждения.

Свой пред пост дополнил.

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


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


Местный
***

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



Цитата(GetSmart @ Aug 2 2018, 18:00) *
В вышеобсуждаемой цитата из стандарта явно указано, что такое выражение разрешено стандартом (сложение чисел с именем массива).


Если уж быть корректным, то сложение чисел не с именем массива, а с указателем (на тип элементов из которых состоит массив), в качестве которого выступает имя массива и равным алресу его "инициирующего элемента".




Цитата(GetSmart @ Aug 2 2018, 18:00) *
<Адрес> точнее будет заменить на <что-то> (неуказанное в стандарте), содержащее адрес, указывающий на вышеобозначенный тип. (пример: <сперва выполнено (E1)+(E2) и результатом будет {как заявлено в цитате из стандарта} - адрес элемента массива.> ==> <что-то> с адресом элемента массива) И к этому <что-то> применим оператор *.


В стандарте в качестве этого <что-то> употребляют термин "роinter". Это к тому, из-за чего весь сыр-бор пошел.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 2 2018, 16:49
Сообщение #13


.
******

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



Цитата(aiwa @ Aug 2 2018, 19:53) *
В стандарте в качестве этого <что-то> употребляют термин "роinter". Это к тому, из-за чего весь сыр-бор пошел.

Туда же добавил
<К указателю он тоже применим, но их идентичность это не доказывает, без документального подтверждения.>

Цитата(aiwa)
Если уж быть корректным, то сложение чисел не с именем массива, а с указателем (на тип элементов из которых состоит массив), в качестве которого выступает имя массива и равным алресу его "инициирующего элемента".


Сложение с именем массива:
result = *(array+5)

Сложение с указателем (на тип элементов из которых состоит массив):
result = *(&array[0]+5)

В цитате было (буквально) сложение с именем массива.

Цитата
The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2)))

Переводится как <Определением <subscript operator []> является то, что {неявно подразумевается: выражение} E1[E2] идентично {выражению} (*((E1)+(E2)))>
Цитата
И далее объяснение - потому что "E1 is an array object (equivalently, a pointer to the initial element of an array object)".

Из чего следует, что в текстах разрешено использовать выражения со сложениями целых чисел с именами массивов. Без оговорок на размерность массивов.

Upd: А ещё точнее: с такими же ограничениями как и для оператора [].
Всё это не исключает при сложениях и такой возможности: при невозможности к аргументу применить оператор [], могут быть применены другие правила (если они определены), как то: трансформация аргумента в указатель и сложение с этим указателем.

То, что в определении имя заключено в круглые скобки - сути не меняет, т.к. в этом выражении они являются оператором изменения очерёдности выполнения других операторов. (чорт его знает как скобки там дословно определили) И (array)[index] по смыслу исполнения равноценно array[index], когда внутри скобок нет операторов. {неявно подразумевая: в тексте после препроцессора}

-------------
Дежа-вю
Цитата(Сергей Борщ)
От перемены мест слагаемых сумма не меняется.

Цитата
Не надо гипотез. В стандарте все описано. И неявные преобразования, и коммуникативность сложения.


Сообщение отредактировал GetSmart - Aug 3 2018, 08:01


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


Местный
***

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



Цитата(GetSmart @ Aug 2 2018, 19:49) *
Сложение с именем массива:
result = *(array+5)

Сложение с указателем (на тип элементов из которых состоит массив):
result = *(&array[0]+5)

В цитате было (буквально) сложение с именем массива.


Не путайте терминологию: имя массива - это идентификатор, арифметические с которыми бессмыслены.

Приведенные Вами два примера отличаются лишь небольшой деталью.
Во втором Вы сами используете указатель, а в первом тот же указатель получается "implicitly" - согласно стандарту: "by converting an array name to a pointer".


Цитата(GetSmart @ Aug 2 2018, 19:49) *
Из чего следует, что в текстах разрешено использовать выражения со сложениями целых чисел с именами массивов. Без оговорок на размерность массивов.


Ну да, про коммутативность это понятно - побочный эффект.
Равно как по той же причине в массиве размерности 5x5 доступ к "последнему" элементу a[4][4] вполне может быть реализован как a[15][0] или a[0][15].

Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 3 2018, 12:09
Сообщение #15


.
******

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



Цитата(aiwa @ Aug 3 2018, 13:32) *
Не путайте терминологию: имя массива - это идентификатор, арифметические с которыми бессмыслены.

Приведенные Вами два примера отличаются лишь небольшой деталью.
Во втором Вы сами используете указатель, а в первом тот же указатель получается "implicitly" - согласно стандарту: "by converting an array name to a pointer".

Определение дано на текстовом примере. После этого запрещать описание словами текстовых конструкций языка бессмысленно. Кроме того, в данном контексте <имя массива> более однозначно описывает <инструкцию> писателя кода. Если я напишу <массив>, то сразу подменю обсуждаемую <инструкцию> до многих вариантов текстового представления. Поэтому такие формулировки имеют право быть. Добавлять везде <в тексте> излишне, это неявно контекстно подразумевается. Скорее будет важно: до препроцессора или после, всякие области видимости, наложения имён переменных, макросов и прочего. По-умолчанию в таких формулировках разумно считать, что интерпретация текста по стандарту в том тексте выявит однозначно: имя массива, оператор сложения и целое число 5. И оператор сложения будет выполнен до всех иных операторов.

Цитата(aiwa @ Aug 3 2018, 13:32) *
Равно как по той же причине в массиве размерности 5x5 доступ к "последнему" элементу a[4][4] вполне может быть реализован как a[15][0] или a[0][15].

Ерунда какая-то. 5*5=25

Сообщение отредактировал GetSmart - Aug 3 2018, 12:54


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


Местный
***

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



Цитата(GetSmart @ Aug 3 2018, 15:09) *
...Если я напишу <массив>, то сразу подменю обсуждаемую <инструкцию> до многих вариантов текстового представления. Поэтому такие формулировки имеют право быть.

В оригинале сказано именно массив, что эквивалентно указателю на первый элемент: "if E1 is an array object (equivalently, a pointer to the initial element of an array object)"
Но если массив или имя массива смотрятся как синонимы, то "прибавление к имени массива" как-то не комильфо.

Цитата(GetSmart @ Aug 3 2018, 15:09) *
Ерунда какая-то. 5*5=25

Ну да, отвлекся и написал для массива 4x4, правильно было бы а[0][24] и a[24][0]. Но не важно, - главное, что коммутативность арифметики с указателем приводит к такому побочному эффекту.
Поэтому не стоит это ставить во главу угла.

Сообщение отредактировал aiwa - Aug 3 2018, 13:01
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 3 2018, 13:58
Сообщение #17


.
******

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



Цитата(aiwa @ Aug 3 2018, 16:57) *
В оригинале сказано именно массив, что эквивалентно указателю на первый элемент: "if E1 is an array object (equivalently, a pointer to the initial element of an array object)"

<(equivalently, a pointer> в данном контексте переводится как: <(равно{значно} {допустимо}, если это указатель>
фигурными скобками выделил неявный смысл, который, при желании, можно не писать. В контексте этого абзаца <equivalently> не определяет, что везде в языке оба варианта равнозначны. Ещё, из этой цитаты не понять, какое действие вызывает оператор [], применимый к обычному указателю. Даже из всей главы <6.5.2.1 Array subscripting> непонятно, какое действие по стандарту выполняет применение [] к указателю на не массив (на не элемент массива). В её вступлении написали
Цитата
One of the expressions shall have type "pointer to
object type", the other expression shall have integer type,
and the result has type "type"

Далее везде "если это массив или указатель на начальный элемент массива то ...".
PS но я мельком прочитал эти три абзаца. Прошу опровергнуть, если я неправ.

Upd
Учитывая вступительную цитату, с которой я только что ознакомился моё утверждение <В цитате было (буквально) сложение с именем массива. >
правильнее заменить на <В цитате вполне допускалось сложение с именем массива.>

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


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


Местный
***

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



Цитата(GetSmart @ Aug 3 2018, 16:58) *
В контексте этого абзаца <equivalently> не определяет, что везде в языке оба варианта равнозначны.

Та там всего три абзаца, из которых следует вывод, что имя массива почти всегда (за исключением, например, sizeof правила для которого обговорены в отдельном пункте) преобразуется в указатель на первый элемент массива причем того же типа. С дальнейшими правилами действий для такого указателя.
Таким образом из выражений *((E2+5)+E1), ((E2)+5+(E1)) и подобных невозможно что-либо утверждать про размерности массива.

Цитата(GetSmart @ Aug 3 2018, 16:58) *
Даже из всей главы <6.5.2.1 Array subscripting> непонятно, какое действие по стандарту выполняет применение [] к указателю на не массив (на не элемент массива).


Никаких указателей на не массив и прочее.
Так название главы означает что оператор [] применим только для доступа к элементам массива.




Сообщение отредактировал aiwa - Aug 3 2018, 14:20
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
|||- - andrew_b   Цитата(GetSmart @ Aug 2 2018, 19:49) Туда...   Aug 3 2018, 05:01
||- - 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 Текстовая версия Сейчас: 12th August 2025 - 22:47
Рейтинг@Mail.ru


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