143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Перенаправление указателя при перегрузке оператора в variadic template18.04.2015, 16:19. Показов 2519. Ответов 35
Метки нет (Все метки)
Есть вот такой вот код (сделан в vs2014):
Как видится всё это... Вот это должно по сути сработать... (пока что статически написан "0", в будущем конешно хотелось бы тоже поправить, чтоб можно было изменить, для этого int Cur хотел использовать)
И ещё, смежный вопрос, как в самом шаблоне проверить какой тип требуется и адрес. Т.е. хотелось бы чтоб в шаблоне можно было тоже следить за поведением переменных.
0
|
18.04.2015, 16:19 | |
Ответы с готовыми решениями:
35
Передача в метод по перегрузке оператора указателя на объект Ошибка при перегрузке оператора == Ошибка при перегрузке оператора << Ошибка при перегрузке оператора >> |
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
20.04.2015, 13:31 [ТС] | 2 |
Ну так шо, нету никаких соображений?..
0
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
20.04.2015, 18:56 | 3 |
Очень уж запутанный и непонятный вопрос. Выражения вроде "хочу, чтобы нужная переменная вызывалась из указателя" и "шаблон ссылается на адрес" тоже ясности не добавляют. А уж без понимания замысла, стоящего за этим нагромождением объединений и однобуквенных имён, разобраться совсем трудно. Ну и тексты сообщений об ошибке не повредили бы делу.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
20.04.2015, 20:16 [ТС] | 4 |
В общем то это и хочу. Почему: хочу уменьшить размер uniona до 4 байт, для этого надо избавиться от 8 байтовых типов, как - либо их не использовать совсем (что невозможно просто, т.к. они нужны), либо использовать указатель на них, т.к. указатель 4 байтный, то это бы решило проблему, но не работает...
Уже как тока не пробовал... Никак... совсем. (и вообще мне кажется шаблон даже не обращяет внимание на перегруженный оператор, а ссылается именно к адресу переменной, т.е. к адресу v[1][2].d, но никак не к указателю на pd[0]) *Прикрепил принт ошибки. И да, ошибка возникает при удалении "delete[] v[1][2].d.pd;" (потому что до "cout << "End Programm" << endl;" не доходит)
0
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
20.04.2015, 22:21 | 5 |
Ошибка возникает из-за путаницы с выделением-освобождением (вероятно, какой-то участок памяти удаляется повторно).
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
20.04.2015, 22:31 [ТС] | 6 |
НЕТ с выделением памяти и удалением всё ок.
Результат функции видели на картинке? Она выдаёт не верный ответ, а должен быть как в тестовом примере. Я предполагаю(УВЕРЕН!), что: при направлении v[1][2].d аргумента в шаблоне заполняется не pd элемент, а 8 байт начиная с "&v[1][2].d", т.е. не в указатель на pd[0], а сам .d адрес, в итоге затирается pd указатель на выделенный массив, и результат - невозможно удалить указатель, т.к. адрес к нему был затёрт результатом функции. П.С. Я 100% нуб, и то понимаю это)))
0
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
21.04.2015, 18:54 | 7 |
Ну тогда попробуем выяснить, вокруг чего такой кипеш. Функция call. Она получает указатель на функцию, у которого выдрана вся информация об аргументах и возвращаемом значении. Она получает пару экземпляров union, один из которых используется для получения результата, а другой передаётся в вызываемую функцию. Предполагается, что функция вернёт тот же union, который записывается в r. Однако же atof возвращает double, а не означенный union. Отсюда и проблемы. Половина возвращённого double впихивается в union и позже интерпретируется как указатель, а половина попросту теряется.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||
21.04.2015, 20:02 [ТС] | 8 | |||||
ЧТо, куда? Указатель на функцию - это первый аргумент с типом PVOID. Второй аргумент - возвратное значение, тип POINTER DOUBLE. Третий параметр - аргумент самой функции "atof".
Тетстовый и работающий пример в коде: Atof возвращяет double, именно реальный, а не указатель, если бы он вернул указатель, то всё было бы ок. О чём ты говориш я вообще не вдупляю. Пустословием не занимайся, явно покажи как исправить. До этого я тестировал с такими поправками:
0
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||||||
21.04.2015, 20:24 | 9 | |||||
То, что ты не понимаешь, о чём я говорю, не значит, что я занимаюсь пустословием. Это значит, что тебе надо восполнять пробелы в знаниях, а также внимательно перечитывать непонятные места.
Так уж и быть, объясню повторно, специально для сумрачных гениев. Функция atof возвращает 8-байтовый double, согласно cdecl calling convention, это значение возвращается в регистрах EAX и EDX. В функции call написано:
Как исправить - тут уж сам страдай, я в эту невменяемую кашу со стиранием типов лезть не хочу.
1
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
21.04.2015, 21:13 [ТС] | 10 |
Причём тут fun ? Это лишь указатель на функцию, не более. И он не имеет отношения к размеру double аргумента. Более того, я повторно показал код, который демонстрирует что с реальным double всё работает.
Желчь можете оставить себе.
0
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
21.04.2015, 21:38 | 11 |
При том, что при инстанциации шаблона call этому указателю явно вменяется определённый тип. В этом типе, помимо прочего, указано, что эта функция возвращает Result (то есть, тот самый многострадальный 4-байтный union). И когда в fun передаётся адрес atof (возвращающий результат в EAX:EDX), внутри данной инстанциации call всё равно генерируется вызов, соответствующий вменённому типу, игнорирующий содержимое EDX и заносящий содержимое EAX в v[1][2].d по ссылке. Ну и понятное дело, что при прямом вызове atof в твоём "примере, в котором всё работает" всё шоколадно: там-то в месте вызова имеется полная информация как об аргументе, так и о возвращаемом значении. А вот внутри call о переданной туда функции уже абсолютно ничего неизвестно, и приходится руководствоваться тем, что ты сообщишь. То есть, типом, к которому приводится fun, не имеющим ничего общего с atof кроме количества аргументов.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||
22.04.2015, 05:38 [ТС] | 12 | |||||
Так 8 байт же должно передаться, для этого и перегруженный оператор должен перенаправить результат в указатель, в котором есть место для этих 8 байт. Ведь если в функции явно аргумент или возвращяемое значение типа поинтера, то тоже всё шоколадно.
а для чего это шаблону? это запрашивает сама функция из списка аргументов в шаблоне, там уж что дадут то и будет, я потому и хочу подменить адрес с v[1][2].d на указатель... чтоб туда адрес значение писал.(в данном случае) Добавлено через 4 минуты
0
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
22.04.2015, 19:03 | 13 |
С какой бы стороны зайти, чтобы пробиться сквозь эту стену упрямого непонимания...
Вот все эти операторы преобразования - они работают тогда, когда есть несоответствие реального и ожидаемого типа. В функции call такого несоответствия нет, там всё идеально совпадает. Потому что там из типов данных - только этот невменяемый union. Потому что именно он передаётся в call при вызове. union передаётся в call, union передаётся дальше в вызываемую функцию, возвращаемое ей значение интерпретируется как union и тупо побайтово копируется в r.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
22.04.2015, 19:36 [ТС] | 14 |
Чё ты прицепился к этому union'у? Меня интересует почему перегруженный оператор не срабатывает, и не перенаправляет double в pd[0]. ~ ~
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
22.04.2015, 21:43 | 15 | |||||
Он тебе на это и ответил. Для того, чтобы сработал оператор, нужно, чтобы, грубо говоря, в левой части выражения был требуемый тип. А там у тебя шаблон.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||
22.04.2015, 22:36 [ТС] | 16 | |||||
Нет не так, по крайней мере я так думаю. Одно дело у тебя какой то там пустой шаблон, а другое дело когда аргументы запрашиваемые шаблоном зависят от функции, которую "вызывает этот шаблон"(не корректно наверно сказал, но не суть). Ведь если было бы не так как я сказал, то к чему вообще обращялся бы шаблон?..
Так что есть решение для моей задачи или нету? =) Добавлено через 1 минуту П.С. Код какой то левый:
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
22.04.2015, 23:17 | 17 |
Это вообще-то к сути явления не относится. Я там мог хоть черта в ступе написать, суть неизменна.
Нет, это именно так. Больше добавить нечего. Он обращается к тому, что ты передал. А передал ты union. Об этом тебе уже писал Nick Alte выше. Какую из функций преобразования вызвать шаблон не знает. В этом проблема. Добавлено через 19 минут Пока дело не доходит до вызова функции, задачу можно решать средствами языка (хотя конечно не совсем так, как у тебя). Главная сложность заключается в том, что средствами С++ невозможно динамически сформировать прототип для вызова. Прототип в С++ - это единица времени компиляции. Компилятор рассчитывает место на стеке под аргументы, исходя из статической информации о типе. Иными словами, это фундаментальное ограничение, вследствие статической типизации С++ (об этом уже говорилось неоднократно). Без подключения внешних инструментов (ассемблера) решить задачу до конца не получится. Если сузить рамки немного, и попытаться вызывать так не любую функцию, а только такие, которые "понимают" придуманную тобой динамику с юнионами, то задача решается. Но я понимаю, что это тебе не подходит.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
23.04.2015, 14:49 [ТС] | 18 |
И что с того что передаётся union, из uniona то извлекается то что требует функция. Оно всегда union, но если аргумент указатель, то извлекается 4 байта адреса и по адресу берётся уже значение, если реальное значение то соотв. типу берётся значение из самого uniona.
Я блин и спрашиваю, почему не срабатывает перегруженный оператор, который поидее должен перенаправить получение данных из указателя. Странные вы.
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|||||||||||
23.04.2015, 16:37 | 19 | ||||||||||
А я тебе отвечаю, что он не срабатывает, потому что компилятор не знает к какому типу нужно приводить и не знает, что вообще нужно что-то приводить.
Я тебе пример выше написал. Когда аргумент функции задан типом, а не шаблоном, то оператор срабатывает, когда задан шаблоном, то нет. Потому что шаблон - это не тип. Это потенциально возможное множество типов, потенциально бесконечное. Ну и какой прикажешь вызвать оператор? Шаблон вывел тип, который передали. Передали ему d (вот здесь) Какого типа у нас d? Правильно, анонимный union. Вот именно этот тип шаблон и вывел. Еще раз, операторы преобразования работают только если стоит конкретный тип
Чтобы заработал оператор приведения, нужно подсказать компилятору, какое преобразование необходимо выполнить (например):
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
23.04.2015, 16:51 [ТС] | 20 |
Но ведь третьим аргументом, он же указатель на char понимает. С чего он его понимает, если написан точно так же анонимный юнион?..
Вот этот статический метод совсем не катит, я для того и создал такой вот union и шаблон чтоб избавиться от того, чтоб для каждой функции делать привидения статичными. ( и по сути, если бы не эти 8 байт, то можно было бы пользоваться )
0
|
23.04.2015, 16:51 | |
23.04.2015, 16:51 | |
Помогаю со студенческими работами здесь
20
Ошибки при перегрузке оператора << Предупреждение при перегрузке оператора Ошибка при перегрузке оператора + Variadic template Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации
В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
|
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира
В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
|
Компьютер и информация
hw_wired 28.01.2025
Эволюция вычислительных машин
История развития вычислительной техники начинается задолго до появления первых электронных устройств. Человечество всегда стремилось упростить процесс вычислений и. . .
|
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией
В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
|
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации
В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
|
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий
В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
|
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO
/ / https:/ / leetcode. com/ studyplan/ top-interview-150/
package topInterview
. . .
|
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
|
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
|
КуМир: решение геометрических задач
bytestream 28.01.2025
Программирование геометрических задач в среде КуМир становится всё более актуальным в обучении школьников и студентов. КуМир — это разработанная в России обучающая программная среда, предназначенная. . .
|
КуМир, исполнитель Водолей: Задачи и решения
bytestream 28.01.2025
КуМир — это образовательная среда для обучения программированию. Она предлагает пользователям разнообразные инструменты для разработки и отладки программ, что особенно ценно для студентов и. . .
|
КуМир, исполнитель Чертежник: Решение задач
bytestream 28.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения основам программирования и алгоритмизации.
Исполнитель Чертежник работает на координатной плоскости, где может. . .
|