|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||||||||||||||||||||
Перенаправление указателя при перегрузке оператора в variadic template18.04.2015, 16:19. Показов 3111. Ответов 35
Метки нет (Все метки)
Есть вот такой вот код (сделан в vs2014):
Как видится всё это... Вот это должно по сути сработать... (пока что статически написан "0", в будущем конешно хотелось бы тоже поправить, чтоб можно было изменить, для этого int Cur хотел использовать)
И ещё, смежный вопрос, как в самом шаблоне проверить какой тип требуется и адрес. Т.е. хотелось бы чтоб в шаблоне можно было тоже следить за поведением переменных.
0
|
|||||||||||||||||||||
| 18.04.2015, 16:19 | |
|
Ответы с готовыми решениями:
35
Передача в метод по перегрузке оператора указателя на объект
Ошибка при перегрузке оператора << |
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||
| 23.04.2015, 18:06 | |||
|
Знаешь, чтобы прояснить ситуацию, тебе надо задать другие вопросы. Например, тебе наверняка было бы полезно узнать как посмотреть какие именно типы попали в шаблон, чтобы разбираться по факту увиденного. а не по факту догадок. Интересно?
0
|
|||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||||
| 23.04.2015, 18:26 [ТС] | |||||
|
0
|
|||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||||||||||||||||||||||||||||||||||||||||
| 23.04.2015, 19:48 | ||||||||||||||||||||||||||||||||||||||||
|
Вот код:
Это параметры самой функции call (выделил жирным куда смотреть)
Причем твой второй якобы работающий пример, все равно не работает, т.к. возвращает мусор, вместо 123.32. А все потому, что результат функции atof - double. Ты знаешь как возвращаются числа double в ассемблере? Если проще будет понять на примере, то вот код.
Реализация функций такая:
Для первой функции код, сгенерированный компилятором будет таким
Для второй функции код такой:
В твоем коде картина та же.
0
|
||||||||||||||||||||||||||||||||||||||||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||
| 23.04.2015, 22:27 [ТС] | |||
|
Откуда все эти ASM вообще ты берёш?.. и чё за FPU)) Добавлено через 10 минут *Я так понимаю ты меня склоняеш к тому что ассемблерные вставки мне помогут... Ну пойду читать)
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||||
| 23.04.2015, 23:22 | ||||
Сообщение было отмечено Izual как решение
РешениеFPU
1
|
||||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||
| 23.04.2015, 23:31 [ТС] | ||
|
Жалко конешно что "просто из перегруженного оператора" нельзя сделать то что я хочу, ну значит есть куда стремиться ещё. Гора, Магомет уже идёт)))
0
|
||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||||||||||||||||||||||||||||||||||||||||||
| 26.04.2015, 16:43 [ТС] | |||||||||||||||||||||||||||||||||||||||||||
|
DrOffset, да дизассембл интересная вещь... Жаль что твой пример, по крайней мере мне, сложно понять...
Собственно пока я тут копаюсь, накопалось оказывается, что без указания типа оператор double не срабатывает вообще. Т.е. на сколько я понял: С таким подходом:
Хотя почему они все dword я ещё не вкурил...Добавлено через 13 минут Ну и естественно из за этого сам шаблон уже по другому вопринимает данные. Без типа:
Добавлено через 7 минут Добавлено через 17 часов 12 минут
Лан, ушёл дальше ковыряться)
0
|
|||||||||||||||||||||||||||||||||||||||||||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||||||||||||||||||||||
| 28.04.2015, 21:39 [ТС] | ||||||||||||||||||||||||||
|
Перегруженный оператор uniona не дал в итоге мне возможность возвращять разные типы значений.
Может ли функция вернуть разный тип? Читал про перегрузку функций и шаблоны, но ни то ни другое пока не нашёл как применить в виду следующих причин: 1. Перегруженная функция обязана иметь разные типы или кол-во аргументов. А у меня аргумент всегда один (структура). 2. Шаблонная функция требует статически написать тип, например:
Подразумевается:
Использовать хочу для вызова своей функции:
0
|
||||||||||||||||||||||||||
|
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
|
|||
| 28.04.2015, 22:27 | |||
|
0
|
|||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||
| 28.04.2015, 22:34 [ТС] | |||
|
Добавлено через 1 минуту
0
|
|||
|
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
|
|||
| 28.04.2015, 22:44 | |||
|
Добавлено через 3 минуты Добавлено через 4 минуты Либо некий обобщённый handle на ресурс и много switch-ей и cast-ов везде, где нужно знать тип объекта.
0
|
|||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||||||
| 28.04.2015, 22:58 [ТС] | |||||||
|
типа:
Если можно было бы создать одну функцию (с ~20 case под кол-во типов), в чём собственно и вопрос)
0
|
|||||||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||
| 01.05.2015, 08:11 [ТС] | ||
|
Я так предполагаю, что дело происходит так: Ляляля, вызывается функция atod, наверно неважно как туда попали данные, сама функция сделает всё правильно не зависимо от того, union ли туда передали или нет и возвратит тоже правильно, но уже из возвращяемого значения (из стека наверно) будет произведена конвертация в тип union, а тут уже "как получится" (предполагаю что вернуло по инструкции long long(8 байт же), ведь для каждого типа свои блоки памяти для опр. перечней данных, ну типа где знак, где целая часть, где дробная и т.д.) В общем, используя ассемблер можно ли подменить тип возврата? Или может можно извлечь "не правильно скомпанованные данные" и поменять что то(в каких то регистрах) местами по нужной конструкции double, и будет как надо?...
0
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||||||||
| 02.05.2015, 17:44 | ||||||||
|
Izual, не очень понятно что ты хочешь.
Но сразу скажу что сделать нельзя. Нельзя динамически, имея только указатель на функцию, узнать каким именно образом она возвращает данные. Через регистры общего назначения, FPU или еще как. Это можно сделать, только заранее зная прототип этой функции и правильную конвенцию вызова. И это касается не только С++ .
Вторая задача, еще более сложная. Нужно сделать так, чтобы на основе информации времени исполнения, сохраненной в нашем вариантном типе (это информация о том, какой там тип на самом деле), сгенерировался правильный вызов некой процедуры. От процедуры у нас есть только адрес, ну и конвенция вызова (если это вызовы win api, то она известна и едина для всех них). Вот это решить средствами С++ на 100% нельзя. И код, который будет осуществлять вызов нашей процедуры придется генерировать динамически прямо в памяти, а потом отдавать ему управление. Естественно, если процедура на самом деле имеет другие параметры или другую конвенцию вызова, мы, при таком подходе, становимся никак не защищены от падений и других спецэффектов. Т.е. все на наш страх и риск. Т.е. вторая задача потребует от тебя написать маленький компилятор внутри своей программы, который будет прямо в памяти делать код для вызова исходя из динамической информации о типе, сохраненном в variant. Есть готовые реализации таких вещей, у некоторых компиляторов есть api для JIT генерации кода, есть еще вот такая библиотека. Но если ты все-таки собрался все-все делать сам, приготовься к тому, что изучать придется очень много, и поверхностным ознакомлением не обойтись.
0
|
||||||||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||||||||||||||||
| 05.05.2015, 11:07 [ТС] | ||||||||||||||||||||
|
Да и виртуальная функция не подойдёт, т.к. мне надо разный тип получать, а вирт. функции возвращяют всё по одному прототипу. Шаблон дал лиш часть, как видно, но не всё что надо... Сам же знаеш) Добавлено через 1 час 55 минут Сижу пока асм изучаю, пытаюсь свою теорию по поводу стэка подтвердить... Нашёл вот что:
0
|
||||||||||||||||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||||
| 05.05.2015, 13:33 | |||||
|
В зависимости от типа возврата, результат может быть в регистре (или регистрах) общего назначения, в специальных регистрах, на стеке. В регистре может быть как значение, так и адрес стековой памяти, где лежит большой объект. В общем виде нельзя, имея лишь адрес функции, сказать, каким именно способом она вернет значение. Вот немного материала по теме. Уж не обижайся.
0
|
|||||
| 05.05.2015, 13:33 | |
|
Помогаю со студенческими работами здесь
36
Ошибки при перегрузке оператора <<
Variadic template Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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. Пошагово создадим проект для загрузки изображения. . .
|