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

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

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

Добрый вечер.
Можно ли создать шаблон, что бы не приводить явно универсальный указатель к определенному типу при разыменовании?
Или по крайней мене узнать тип (размер) данных которые хранятся по указанному адресу?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2013, 22:46
Ответы с готовыми решениями:

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

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

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

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

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

38
Kuzia domovenok
2358 / 2092 / 494
Регистрация: 25.03.2012
Сообщений: 7,493
Записей в блоге: 1
24.02.2013, 22:47 2
нет, а зачем?
0
fuelcs
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
ITcrusader
Эксперт С++
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
fuelcs
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
ITcrusader
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 23:08 6
Вот оно что) А может лучшее решение найдется после ответа на вопрос "А зачем?"
0
fuelcs
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
Kuzia domovenok
2358 / 2092 / 494
Регистрация: 25.03.2012
Сообщений: 7,493
Записей в блоге: 1
24.02.2013, 23:19 8
Цитата Сообщение от fuelcs Посмотреть сообщение
а толку с универсального указателя, если что бы его разыменовать нужно указать тип?
смотри сишные универсальные функции, использовавшиеся до шаблонов. qsort, memset, memcpy
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.02.2013, 23:22 9
Цитата Сообщение от fuelcs Посмотреть сообщение
void* pa=&a,*pb=&b,*pc=&c
Вот здесь вы теряете всю информацию о типах. А это очень плохо. Не надо использовать void* в плюсах, ведь практически всегда есть альтернативы.
0
ITcrusader
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 23:22 10
Ну, в общем, так. Использование указателей на void целесообразно в единичных случаях (и то, с целью лютой унификации и спрятано должно быть в недрах реализации), например, при создании контейнера и то требует надстройки интерфейса над этим ночным кошмаром, который будет осуществлять строгий контроль типов. Я, может, это от безысходности пишу)) Но батьки так советуют (Мейерс, Скотт).
1
Kuzia domovenok
2358 / 2092 / 494
Регистрация: 25.03.2012
Сообщений: 7,493
Записей в блоге: 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
diagon
Higher
1937 / 1203 / 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
fuelcs
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
Kuzia domovenok
2358 / 2092 / 494
Регистрация: 25.03.2012
Сообщений: 7,493
Записей в блоге: 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
fuelcs
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
diagon
Higher
1937 / 1203 / 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
fuelcs
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 23:49  [ТС] 18
diagon, я имел ввиду свой код с memset...
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.02.2013, 23:58 19
Цитата Сообщение от fuelcs Посмотреть сообщение
memset(arr,10,sizeof(arr));//почему это не работает?
Потому что оно каждому байту (не int'у, а именно байту) присвоит значение 10.
1
fuelcs
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
25.02.2013, 00:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2013, 00:09

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

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

Как правильно удалять выделенную память под указатель на указатель?
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt;...


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

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

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