Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/22: Рейтинг темы: голосов - 22, средняя оценка - 5.00
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
1

Указатель на void

18.08.2013, 14:16. Показов 4243. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как можно сделать универсальную функцию, которая принимает указатель на неопределенный тип, увеличивает значение на которое указывает этот самый указатель и возвращает его.

Что-то вроде этого (нерабочий вариант):

C++
1
2
3
4
5
void *f(void *pv)
{
    *pv = *pv + 1;
    return pv;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.08.2013, 14:16
Ответы с готовыми решениями:

Указатель типа void. Использование косвенного связывания через универсальный указатель
Необходимо использовать косвенного связывания через универсальный указатель, примерный вид: struct...

Функция принимает указатель на void и возвращает указатель на int
Запишите прототип функции, которая принимает указатель на void и возвращает указатель на int.

Указатель типа void
Добрый день. enum Type { Double, Int, Float }; void func(int k,enum Type t,...) { void...

Указатель void на структуру
Есть некий тип структуры action. Для функции _beginthread третьим параметром требуется указатель на...

22
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.08.2013, 14:18 2
Видимо как-то так
C++
1
2
3
4
5
6
template <typename T>
T *f(T *pv)
{
    *pv = *pv + 1;
    return pv;
}
0
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
18.08.2013, 14:21  [ТС] 3
0x10, я уже думал про шаблоны. Но хочу именно через указатели void *.
Может есть какие варианты чтобы в функции узнать тип указателя?
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.08.2013, 14:26 4
void* не используется в том контексте, где нужно знать тип. Это просто указатель на кусок памяти, без какой-либо информации о типе и однозначном способе ее узнать. Костыли с явной передачей типа, например, вторым аргументом не рассматриваю.
1
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
18.08.2013, 14:27 5
BigLow, под не определенным типом вы подразумеваете какой-либо встроенный тип данных? Этот тип должен прежде всего поддерживать арифметические операции.
Если это так, то нужно сначала преобразовать в нужный тип, а затем выполнить увеличение и затем снова преобразовать в void.
C++
1
2
3
4
5
void* increment(void *pv)
{
     *static_cast<T*>(pv) += 1;
     return static_cast<void*>(pv);
}
1
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
18.08.2013, 14:32  [ТС] 6
Цитата Сообщение от gromo Посмотреть сообщение
подразумеваете какой-либо встроенный тип данных?
да, хотя бы для встроенных. Вот как узнать этот тип данных?

Чтобы преобразовать указатель в нужный тип, его сначала нужно узнать. А вот как узнать?
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.08.2013, 14:38 7
Цитата Сообщение от BigLow Посмотреть сообщение
Чтобы преобразовать указатель в нужный тип, его сначала нужно узнать. А вот как узнать?
C void* - никак.
1
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
18.08.2013, 14:51 8
BigLow, нельзя выполнить инкремент неизвестно чего.
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
18.08.2013, 15:53 9
void - это отсутствие типа по-определению. Твоя идея не понятна.
1
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
18.08.2013, 16:17 10
BigLow, зачем тебе узнавать тип? В памяти данные хранятся в виде последовательности байт и никакой информации о типе не содержат.
1
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
18.08.2013, 23:51 11
Kuzia domovenok, без знания типа невозможно правильно выполнить сложение. К примеру если там вещественные числа.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
18.08.2013, 23:57 12
Если не брать в расчет то, что вопрос ТС изначально поставлен не корректно,
то в качестве такого же не корректного ответа можно предложить следующее: кастить указатель к типу char ( (char *)ptr ) и увеличивать его ( *((char *)ptr) += x; ).
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
19.08.2013, 00:10 13
BigLow, если нужно что-то увеличивать, надо для начала узнать что это. А если даже предположить, что это целое, нужно еще знать и разрядность этого целого. Одно дело увеличить char, и совсем другое - int.

Не по теме:

Пойди туда - не знаю куда, принеси то - не знаю что.

1
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
19.08.2013, 00:23 14
BigLow, увеличение указателя Type *ptr на 1 означает увеличение его значение на sizeof(Type) байт. Другими словами Ваш вопрос:
Цитата Сообщение от BigLow Посмотреть сообщение
Как можно сделать универсальную функцию, которая принимает указатель на неопределенный тип, увеличивает значение на которое указывает этот самый указатель и возвращает его.
Сокращается до: можно ли по указателю на void узнать на какой тип, в действительности, он указывает? Ответ: нельзя.
Потому что в действительности он указывает на байт. Более того, преобразовывая указатели к разным типам, можно обращаться к одному и тому же адресу, читая разные вещи, в представлении этих типов.
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
19.08.2013, 00:35 15

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Пойди туда - не знаю куда, принеси то - не знаю что.
BigLow, на самом деле, перед Вами стоит какая-то конкретная задача?



Добавлено через 12 минут
Мне кажется (или не кажется а так и есть?), что самым простым и верным ответом будет ответ: Никак.

Не по теме:

Сам не пойму, почему мы разводим демагогию по этому поводу.. какая сила нами движет...? Может быть сила вредности? Которая стремит нас к высшей цепочке во множестве звеньев этой цепи?.. А может другая?...
Извините за философию..

1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
19.08.2013, 00:40 16
castaway, конкретной задачи скорее всего не стоит. Просто чел осваивает конструкции языка, и в итоге рождаются такие вот нелогичные монстры. Из последних:
Как узнать в какой ОС запускается программа?
Как стать программистом за 2 недели?
2
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
19.08.2013, 00:49 17
Tulosba, спасибо, тут я с тобой согласен, это очевидно. Тогда давайте посоветуем ТС умную книгу. Даже не книгу, а раздел им посвященный: Литература C++

Не по теме:

P.S.: в моих словах нет ни капли иронии и отвращения к названию темы. Я говорил, так сказать, "от души". Исключительно только для того чтобы помочь новичкам. Поэтому прошу считать мои слова не оскорбительными.

1
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
19.08.2013, 09:18  [ТС] 18
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
BigLow, зачем тебе узнавать тип?
Цитата Сообщение от Tulosba Посмотреть сообщение
Пойди туда - не знаю куда, принеси то - не знаю что.
Цитата Сообщение от castaway Посмотреть сообщение
BigLow, на самом деле, перед Вами стоит какая-то конкретная задача?
Я дико извиняюсь за неправильно поставленный вопрос. Просто где-то была тема про то как с помощью указателя на void создавался тип данных в который можно записывать любые значения. И вчера вечером мне помогли найти ее. Вот она Список С++

А это я сам вроде пытался что-то сделать, но направление не то было
0
26 / 26 / 0
Регистрация: 10.03.2010
Сообщений: 244
19.08.2013, 09:48 19
а VARIANT не подайдёт?
1
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
19.08.2013, 11:17  [ТС] 20
eXtream, хочется самому сделать такой класс, а не пользоваться готовым )
0
19.08.2013, 11:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2013, 11:17
Помогаю со студенческими работами здесь

Указатель типа void c++
Haпример указатель типа void*ptr char *p void *ptr=&quot;abs&quot;; p=((char *)ptr);Так указатель...

Арифметика указателей (указатель на void*)
У меня есть указатель на void*, который я получил с помощью void *beginPointer = VirtualAlloc(NULL,...

Обобщенный указатель типа void
В приложенной картинке рассказывается о динамическом распределении памяти в С. Сказано, что функция...

Чем плохой указатель на void?
Здравствуйте! Недавно прочитал статью на хабре http://habrahabr.ru/post/102930/ Сабж - архитектура...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru