|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
|
||||||||||||||||
Operator[] for pointer-to-function05.05.2021, 00:19. Показов 2700. Ответов 21
Всем привет!
Внимательно посмотрите на код, и скажите: всё ли с ним в порядке?
Кликните здесь для просмотра всего текста
gcc успешно компилирует, приложение успешно работает.
Но при этом компилятор генерирует предупреждение:
Что говорит по этому поводу стандарт языка? Корректно ли применять operator[] к указателю-на-функцию?
0
|
||||||||||||||||
| 05.05.2021, 00:19 | |
|
Ответы с готовыми решениями:
21
Несоответствие Pointer и addr(function) |
|
фрилансер
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,069
|
|||||||||||
| 05.05.2021, 08:03 | |||||||||||
|
а вот так нет никакого оператора []
Добавлено через 3 минуты ему, похоже, вообще по барабану, сколько раз разыменовывать указатель на функцию ![]()
0
|
|||||||||||
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
|
| 05.05.2021, 12:36 | |
|
1
|
|
|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
|
|
| 05.05.2021, 15:37 [ТС] | |
|
0
|
|
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
|
| 05.05.2021, 15:44 | |
Сообщение было отмечено eva2326 как решение
Решение
1
|
|
|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
|
|||||||||
| 05.05.2021, 15:59 [ТС] | |||||||||
|
Хотите сказать, что этот код не корректен???
Получется, что либо operator[] можно применять только к prvalue-pointer-expression, а значит код в стартопике, и код выше некорректный; либо можно применять к любым pointer-expression, а значит оба образца являются корректными. Но тогда получается, что ваше заявляение:
0
|
|||||||||
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
||||
| 05.05.2021, 16:08 | ||||
|
1
|
||||
|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
|
|||
| 05.05.2021, 16:18 [ТС] | |||
|
Для "указателя-на-функцию" результат получается "функцией", но "функция" не является "object type", и поэтому, данное правило для "указателей-на-функцию" не пременимо. Так?
0
|
|||
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
|
| 05.05.2021, 16:19 | |
|
1
|
|
|
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
|||||||||||
| 05.05.2021, 16:27 | |||||||||||
|
Размышления вслух... Взгляд с другой стороны...
При вызове функции по указателю происходит неявное разыменовывание, т.е. вызов функции по адресу из указателя. Т.е. так прекрасно работает:
p[0] приводит к ошибке...Но, если сделать так:
0
|
|||||||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 05.05.2021, 17:34 | |
|
liv, не очень понятно почему здесь "но". Во втором случае совсем другая ситуация, [] применяются к массиву указателей на функцию. Результат такой операции - указатель на функцию. Указатель на функцию - это объектный тип, поэтому он может быть результатом []. В первом случае [] применяются к указателю на функцию, результат такой операции - функция. Функция не объектный тип, поэтому это приводит к ошибке.
1
|
|
|
Комп_Оратор)
|
||||||||||||
| 05.05.2021, 17:46 | ||||||||||||
pf[1]();
0
|
||||||||||||
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
|||||||||||||
| 05.05.2021, 17:59 | |||||||||||||
() умеет вызывать функции сразу через указатель.А в С функции вообще всегда вызываются только через указатель, то есть не просто никакого разыменования не происходит, а наоборот - при указании имени функции слева от () функция неявно превращается в указатель.Добавлено через 4 минуты true, выведенное как 1. Оператора << для вывода адресов функций не существует, поэтому вместо него, как уже миллион раз объяснялось, используется оператор вывода bool.Если GCC разрешает адресную арифметику для указателей на функции, то это нестандартное расширение, аналогичное адресной арифметике на void *. Не надо лишь пытаться анализировать это поведение через прямое применение <<, ибо будет 1 1 1
3
|
|||||||||||||
|
Комп_Оратор)
|
|||||||
| 05.05.2021, 20:07 | |||||||
char * история. Вспомнил. А бредятина там все же есть. И она в том что (void*)foo и (void*)(foo+1) отличаются на 1. То есть, размер же не должен быть равен 1 ? А выходит, что объекта там и нет. Я знаю что функция - не объект, но фейковый размер в один байт, это не то что хочется иметь задаваясь вопросом - :"А куда же он всё-таки указывает?". Прочесть случайные данные, это не так плохо, как запустить случайный код. И ещё: попытка взять адрес такого указателя не функции, а именно как вы сделали, - указателя: &foo даёт 4 байта разницы. Указатель указателя, работает нормально То есть, это на mingw так.
0
|
|||||||
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
|||
| 05.05.2021, 20:21 | |||
void * указателей, так и к к арифметике указателей на функции. Так им захотелось. Имеют право.foo + 1 и &foo + 1 в контексте моего примера нет. И то и другое запрещено языком. И то и другое "компилируется" лишь благодаря нестандартному расширению GCC. И то и другое реализует арифметику байтов.А у вас в примере вы завели переменную типа "указатель на функцию" и применили к ней &. Это совсем другое. Здесь вы работаете с обычным "указателем на данные". Ничего примечательного в нем нет и ведет но себя точно так же, как и любые другие указатели на данные: размер указуемого типа 4, значит +1 сдвинет указатель на 4 байта. Все как и должно быть.
0
|
|||
|
Комп_Оратор)
|
|||
| 05.05.2021, 20:26 | |||
|
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 05.05.2021, 20:29 | ||
pf - это не "имя функции", а имя переменной-указателя на функцию. Это же разные вещи.
1
|
||
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
||||||||
| 05.05.2021, 20:31 | ||||||||
В вашем примере & применяется не "к имени функции", а к обычной переменной-указателю pf, которая функцией не является даже отдаленно. Отсюда и различия.
1
|
||||||||
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
||
| 05.05.2021, 20:41 | ||
|
"Бредятина" или нет, таковы реалии С и С++.
1
|
||
| 05.05.2021, 20:41 | |
|
Помогаю со студенческими работами здесь
20
Suspicious pointer conversion in function main
Как исправить предупреждение implicit declaration of function и incompatible integer to pointer conversion assigni Incorrect Data Type For Operator Or @function: Text Expected Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|