Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
#1

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

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

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

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

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

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

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

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

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

38
fuelcs
12 / 12 / 0
Регистрация: 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
1929 / 1195 / 49
Регистрация: 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 / 0
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 23:49  [ТС] #18
diagon, я имел ввиду свой код с memset...
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.02.2013, 23:58 #19
Цитата Сообщение от fuelcs Посмотреть сообщение
memset(arr,10,sizeof(arr));//почему это не работает?
Потому что оно каждому байту (не int'у, а именно байту) присвоит значение 10.
1
fuelcs
12 / 12 / 0
Регистрация: 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
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
25.02.2013, 02:59 #21
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
а как же qsort, memset memcpy и прочий stdlib.h???
А они не являются С++ функциями и использовать их в С++ стоит только в уникальных случаях (ровно как и void*).
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
25.02.2013, 04:33 #22
Цитата Сообщение от ForEveR Посмотреть сообщение
А они не являются С++ функциями и использовать их в С++ стоит только в уникальных случаях (ровно как и void*).
С++ мультипарадигменый язык, на нём можно успешно программировать и без ООП и шаблонов. То, что их добавили в С++, не значит, что Си-стиль хуже. Он просто другой.

Вот стоит перед тобой задача заполнить N байт по адресу 0x00ABCDEF значениями 0x01
Разве memset для такой задачи не подходит лучше всего?
1
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.02.2013, 10:35 #23
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Мультипарадигменность — не разрешение делать что угодно. Любой язык общего назначения при должном возрасте становится мультипарадигменным.

Немного помесить память с помощью memset() — это именно что уникальный случай. Если это надо делать часто, то возникает вопрос, зачем вам вообще Плюсы и не перекроет ли оверхед Плюсов все выгоды от memset().

Но вот использовать qsort() в плюсовом коде — это как прийти на автозавод и обнаружить, что всё собирается на конвейере, но дырку под лобое стекло самолично выпиливает безопилой дядя Вася. Это работает, Вася виртуозен и делает всё правильно, вовремя и не отрезает себе ноги, но у инспектора по технике безопасности глаза на лоб полезут и он сразу побежит спрашивать инженеров: "На кой хрен, если у вас тут безопасных механизмов с автоматическим контролем хоть ложкой ешь?" И ведь действительно, на кой хрен? Только потому, что кто-то хорошо знает дядю Васю и поленился настроить ещё один автомат?
4
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
26.02.2013, 15:26  [ТС] #24
Что бы не создавать новую тему дополню вопрос тут, тем более что он связан с темой топика...
Архитектура машины (разрядность), определяет не только общий объем памяти, но и размер ячейки памяти?
К примеру long long доступно только на 64 разрядной платформе (не зависимо от системы)?
Если для хранения переменной нам достаточно, к примеру, 1-2 байта, как выставлены остальные?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
26.02.2013, 23:48 #25
Цитата Сообщение от fuelcs Посмотреть сообщение
Архитектура машины (разрядность), определяет не только общий объем памяти, но и размер ячейки памяти?
Память всегда разбита на минимальные адресуемые ячейки — байты. От разрядности зависят размеры регистров (а от них косвенно быстродействие), размеры адресного пространства. Размеры конкретных типов данных зависят от языка, компилятора и рантайма.
Цитата Сообщение от fuelcs Посмотреть сообщение
К примеру long long доступно только на 64 разрядной платформе (не зависимо от системы)?
На любой. Просто на 32-битных платформах он точно не влезет в один регистр, так что работа с такими числами будет выполняться несколько медленнее.
Цитата Сообщение от fuelcs Посмотреть сообщение
Если для хранения переменной нам достаточно, к примеру, 1-2 байта, как выставлены остальные?
Зависит от типа данных. От него же зависит понятие "достаточности" и "лишнего места". С точки зрения языка лишних байтов вообще нет. Для целых чисел при кодировании дополнительным кодом незначащие биты установлены в нули для положительных и в единицы для отрицательных чисел.
1
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
27.02.2013, 01:38  [ТС] #26
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Память всегда разбита на минимальные адресуемые ячейки — байты
Не совсем понятен принцип работы... К примеру, указатель (int *) указывает на что? Первый-последний байт? В процессе работы программы осуществляется "сборка" числа? Вот пример кода с другого топика Стек и куча: как все это работает?:
Assembler
1
2
3
4
5
6
7
8
9
    movl    $0, -4(%rbp)
    jmp .L2
.L3:
    addl    $1, -4(%rbp)
.L2:
    cmpl    $4, -4(%rbp)
    setle   %al
    testb   %al, %al
    jne .L3
-4(%rbp) - обращение в стек к переменной, $4 - это ее размер в байтах?
Возможно вопросы примитивные, но нагуглить что-то стоящее тяжело...

Добавлено через 30 минут
Работу с память, в следующем примере, рассматриваю как "черный ящик":
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
int main ()
{
    unsigned short a=1;
    void *p1=&a;
    cout << *(int*)p1 << "\n";//
    char b=(char)1;
    void *p2=&b;
    cout <<  *(int*)p2 << "\n";
    return 0;
}
Вывод:
-859045887 (1111111111111111111111111111111111001100110011000000000000000001)
-858993663 (1111111111111111111111111111111111001100110011001100110000000001)

Вывод программы в двоичной системе отличается в один байт...

Вот и решил что так и хранится переменная в памяти...
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
27.02.2013, 02:05 #27
ты уже вообще перемудрил чего-то. Не воспринимай это дело так серьёзно. При чём здесь вообще указатели в твоём примере?
char занимает 1 байт, int - 4
ты присвоил значение 1 байту по адресу &a
а вывел значение 4х байт по этому адресу.
естесственно, все они кроме младшего - случайно оказавшиеся в памяти числа (ну, может не совсем случайно, но к твоим переменным отношение не имеют, они просто за ними стояли.)
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
27.02.2013, 02:44 #28
Цитата Сообщение от fuelcs Посмотреть сообщение
К примеру, указатель (int *) указывает на что? Первый-последний байт?
На первый байт. На тот, у которого адрес меньше.
Цитата Сообщение от fuelcs Посмотреть сообщение
В процессе работы программы осуществляется "сборка" числа?
При чтении из памяти куска из четырёх байт они автоматически собираются из четырёх отдельных байтов в 32-битное число в регистре. Хитрость в том, что число 0x12345678 в памяти может храниться и как 0x78, 0x56, 0x34, 0x12, так и в виде 0x12, 0x34, 0x56, 0x78 (int* указывает на левый байт в этих последовательностях). Гуглите endianness.
Цитата Сообщение от fuelcs Посмотреть сообщение
Вот пример кода с другого топика
-4(%rbp) - обращение в стек к переменной, $4 - это ее размер в байтах?
-4(%rbp) — ага, это обращение к переменной из стека.
$4 — а вот это просто число 4.
0
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
27.02.2013, 13:13  [ТС] #29
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
все они кроме младшего - случайно оказавшиеся в памяти числа
Не согласен насчет "случайных" чисел, "мусор" - да, но не случайный...
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <conio.h>
using namespace std;
int main ()
{
    short a;
    int b;
    cout << a << "\n";
    cout << b << "\n";
    return 0;
}
Вывод:
-13108 (111111111111111111111111111111111111111111111111 1100 1100 1100 1100)
-858993460 (11111111111111111111111111111111 1100 1100 1100 1100 1100 1100 1100 1100)

Добавлено через 21 минуту
К чему это все я? Получается что из за наличия "мусора" в памяти, можно программно определить тип переменных которые находятся в ячейке, на которую указывает указатель типа void*?
По крайней мере для без знаковых переменных...
0
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.02.2013, 13:40 #30
Цитата Сообщение от fuelcs Посмотреть сообщение
К чему это все я? Получается что из за наличия "мусора" в памяти, можно программно определить тип переменных которые находятся в ячейке, на которую указывает указатель типа void*?
бред полнейший, что курил!?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2013, 13:40
Привет! Вот еще темы с ответами:

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

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; void sort_1(const...

Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель - C++
Всем привет, встретил в книге такой пример добавления узла в дерево: typedef struct tree { int data; tree *left, *right,...

Объяснить работу функции, возвращающей указатель на указатель на char - C++
Добрый день! Сможете объяснить что означает запись char **InputFile(int &amp;strings);? Почему именно двойное **? Буду очень благодарна...


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
27.02.2013, 13:40
Ответ Создать тему
Опции темы

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