Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/12: Рейтинг темы: голосов - 12, средняя оценка - 4.75
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
1

универсальный указатель

24.02.2013, 22:46. Просмотров 2481. Ответов 38
Метки нет (Все метки)

Добрый вечер.
Можно ли создать шаблон, что бы не приводить явно универсальный указатель к определенному типу при разыменовании?
Или по крайней мене узнать тип (размер) данных которые хранятся по указанному адресу?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.02.2013, 22:46
Ответы с готовыми решениями:

Универсальный указатель или универсальный скалярный тип
Здравствуйте! Помогите, пожалуйста написать программу: требуется написать универсальный скалярный...

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

универсальный указатель
Возможно ли сделать универсальный указатель, который будет указывать на переменную любого типа?...

Специализация и обобщение в С++ через универсальный указатель
Здравствуйте, уважаемые участники форума! Возникла следующая проблема. Необходимо написать...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
38
3326 / 2700 / 732
Регистрация: 25.03.2012
Сообщений: 9,766
Записей в блоге: 1
24.02.2013, 22:47 2
нет, а зачем?
0
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 22:50  [ТС] 3
Kuzia domovenok, Что бы написать что то подобное:
C++
1
2
3
4
5
template <typename T>
int mult (T* pa, T* pb, T* pc)
{
    return *(T*)pa * *(T*)pb * *(T*)pc;
}
Только тут ошибка, вместо (T*) мне нужно указать тип данных который содержит ячейка памяти...

Просто без этого я не вижу смысла в универсальном указателе....
0
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 23:02 4
Цитата Сообщение от fuelcs Посмотреть сообщение
Только тут ошибка, вместо (T*) мне нужно указать тип данных который содержит ячейка памяти...
Зачем?

C++
1
2
3
4
5
template <typename T>
int mult (T* pa, T* pb, T* pc)
{
    return (*pa) * (*pb) * (*pc);
}
Это ли не то, чего хотел добиться?

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
    int a = 1;
    int b = 2;
    int c = 3;
    std:: cout << mult(&a,&b,&c) << std::endl;
 
    double aa = 1.1;
    double bb = 2.2;
    double cc = 3.3;
    std:: cout << mult(&aa,&bb,&cc) << std::endl;
Ну и пример использования. Или я неправильно понял проблему? Пиши, разберемся
0
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 23:02  [ТС] 5
ITcrusader, как зачем???
C++
1
2
3
4
5
...
int a,b,c;
void* pa=&a,*pb=&b,*pc=&c;
...
mult(pa,pb,pc)
указатель то универсальный...
0
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 23:08 6
Вот оно что) А может лучшее решение найдется после ответа на вопрос "А зачем?"
0
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 23:12  [ТС] 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
template <typename T>
int mult (T* pa, T* pb, T* pc)
{
    return (*pa) * (*pb) * (*pc);
}
 
using namespace std;
 
int main()
{   
    int a,b,c;
    void* pa=&a,*pb=&b,*pc=&c;
    cin >> a;
    cin >> b;
    cin >> c;
    cout << "\n";
    cout << *(int*)pa << " * " << *(int*)pb << " * " << *(int*)pc << " = " << mult(pa,pb,pc) << "\n";
    cout << "\n";
 
    return 0;
}
если указатель про процессе работы будет указывать на разные типы данных...

Добавлено через 1 минуту
Цитата Сообщение от ITcrusader Посмотреть сообщение
"А зачем?"
а толку с универсального указателя, если что бы его разыменовать нужно указать тип?
0
3326 / 2700 / 732
Регистрация: 25.03.2012
Сообщений: 9,766
Записей в блоге: 1
24.02.2013, 23:19 8
Цитата Сообщение от fuelcs Посмотреть сообщение
а толку с универсального указателя, если что бы его разыменовать нужно указать тип?
смотри сишные универсальные функции, использовавшиеся до шаблонов. qsort, memset, memcpy
0
Higher
1946 / 1212 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.02.2013, 23:22 9
Цитата Сообщение от fuelcs Посмотреть сообщение
void* pa=&a,*pb=&b,*pc=&c
Вот здесь вы теряете всю информацию о типах. А это очень плохо. Не надо использовать void* в плюсах, ведь практически всегда есть альтернативы.
0
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 23:22 10
Ну, в общем, так. Использование указателей на void целесообразно в единичных случаях (и то, с целью лютой унификации и спрятано должно быть в недрах реализации), например, при создании контейнера и то требует надстройки интерфейса над этим ночным кошмаром, который будет осуществлять строгий контроль типов. Я, может, это от безысходности пишу)) Но батьки так советуют (Мейерс, Скотт).
1
3326 / 2700 / 732
Регистрация: 25.03.2012
Сообщений: 9,766
Записей в блоге: 1
24.02.2013, 23:25 11
Цитата Сообщение от diagon Посмотреть сообщение
Не надо использовать void* в плюсах, ведь практически всегда есть альтернативы.
а как же qsort, memset memcpy и прочий stdlib.h???
0
fuelcs
24.02.2013, 23:28  [ТС]
  #12

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
memset
можно пример связки memset и void* ?

0
Higher
1946 / 1212 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.02.2013, 23:29 13
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
qsort
Он гораздо медленнее std::sort как раз-таки из-за того, что не имеет информации о типах и не может инлайнить вызов функции сравнения.

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
memset memcpy
Это вообще сишные POD'овые функции, написать с ними что-либо универсальное невозможно.

А вообще, реализация из #4 полностью универсальна(только непонятно, на кой там нужны указатели) и вызывать ее можно для любых типов. Ну а если пользователь этой функции не знает, какие у него типы (то есть передает void*) то это его проблемы, что мы не оправдали его ожидания.
0
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 23:39  [ТС] 14

Не по теме:

C++
1
2
3
4
5
6
7
8
const int n=10;
    int arr [n];
    memset(arr,10,sizeof(arr));//почему это не работает?
    memset(arr,0,sizeof(arr));// а это работает?
    for (int i=0;i<n;i++)
    {
        cout << arr[i] << " ";
    }
memset(arr,10,sizeof(arr)); - в чем ошибка ?



выше сказанное связано с темой?
0
3326 / 2700 / 732
Регистрация: 25.03.2012
Сообщений: 9,766
Записей в блоге: 1
24.02.2013, 23:41 15
Цитата Сообщение от fuelcs Посмотреть сообщение
можно пример связки memset и void* ?
обнулить участок памяти, начиная с некоего адреса. (Из чьей-то лабы драйвера экрана)
C++
1
2
3
4
5
6
7
#define VIDEO_WIDTH 80    //ширина экрана
#define VIDEO_HEIGHT 25   //высота экрана
#define VIDEO_RAM 0xb8000 //адрес видеопамяти
void clear()//Очистка экрана
{
 memset(VIDEO_RAM, 0, VIDEO_WIDTH*VIDEO_HEIGHT);
}
0
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 23:45  [ТС] 16
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Код C++
#define VIDEO_WIDTH 80 * *//ширина экрана
#define VIDEO_HEIGHT 25 * //высота экрана
#define VIDEO_RAM 0xb8000 //адрес видеопамяти
void clear()//Очистка экрана
{
*memset(VIDEO_RAM, 0, VIDEO_WIDTH*VIDEO_HEIGHT);
}
это код для консоли?
0
Higher
1946 / 1212 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.02.2013, 23:47 17
Цитата Сообщение от fuelcs Посмотреть сообщение
выше сказанное связано с темой?
Если вы про мой пост, то напрямую.
Ибо void* - просто адрес чегототам в памяти и вытащить из этого адреса тип невозможно.
Ну, можно использовать ваш код из #2, но для этого вызывающей стороне придется явно указать желаемый тип
C++
1
2
3
4
5
...
int a,b,c;
void* pa=&a,*pb=&b,*pc=&c;
...
mult<int>(pa,pb,pc)
Но так делать не нужно.
0
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 23:49  [ТС] 18
diagon, я имел ввиду свой код с memset...
0
Higher
1946 / 1212 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.02.2013, 23:58 19
Цитата Сообщение от fuelcs Посмотреть сообщение
memset(arr,10,sizeof(arr));//почему это не работает?
Потому что оно каждому байту (не int'у, а именно байту) присвоит значение 10.
1
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
25.02.2013, 00:09  [ТС] 20
diagon, исходя из
Цитата Сообщение от diagon Посмотреть сообщение
Потому что оно каждому байту (не int'у, а именно байту) присвоит значение 10.
и
Цитата Сообщение от diagon Посмотреть сообщение
вытащить из этого адреса тип невозможно
я думаю что ячейка памяти просто набор (к примеру) из 32 бит и при
C++
1
2
3
short a=7;
short* b=&a;
cout << *b;
именно при
C++
1
*b
мы извлекаем с памяти нужные биты тоесть 0000 0000 0000 0111 ?

Я правильно понимаю?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.02.2013, 00:09

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Универсальный вызов метода через указатель на объект
Никак не могу найти универсальную конструкцию, которая позволяла бы вызывать любой метод класс, с...

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения...

А почему нельзя передавать в ф-ю добавления элемента в стек один указатель? Почему нужен именно указатель на указатель?
Вот код ф-ии добавления элемента в стек: void push1(Node **top, int d) { // top...

Функция, принимающая указатель и число байт и выделяющая память под указатель
Здравствуйте. Задача легкая, но почему-то завис Нужно написать функцию, принимающую указатель и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.