Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по void*  (Прочитано 6963 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Balabek
Новенький

kz
Offline Offline

« : 14-12-2010 06:35 » 

Дорогие программисты! Я не студент. Я изучаю Си++ ради собственного интереса, так сказать люблю все знать )), и вданный момент читаю книгу Эккеля по Cи++. Столкнулся в книге с такой задачей:
Определите массив типа int. Получите начальный адрес массива и приведите его к типу void* при помощи оператора static_cast. Напишите функцию, в аргументах которой передаются void*, число (количество байтов) и значение. Функция должна присваивать передаваемое значение каждому байту в заданном интервале.
Решил первую часть:
int m1[10];
cout<<"Adress m: "<<(long) m1<<endl;
void* m2=static_cast<void*>(m1);
Не могу написать функцию ))
и почему каждому байту когда размер m2 4 байта. Если это даже глупый вопрос, подскажите хотя бы как найти ответ ))
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 14-12-2010 07:11 » new

Balabek, не читал эту книгу, но либо ты ее читаешь с середины, либо книга неважная: сперва должен быть усвоен базовый материал, куда включены функции, а только потом в задаче они должны спрашиваться. Попробуй Страуструпа - мне он вполне понравился.

"(long) m1" - это не совсем верно. Лучше "(size_t)(void*) m1" - сперва приводим к обезличенному void*, а потом к типу, имеющему достаточный размер для указателя на данной платформе. Но это подход Си, а не C++. Вариант C++ - через всякие cast-приведения: "reinterpret_cast<size_t>(m1)".
Но в данном случае - для вывода в поток - преобразовывать до целого нужды нет - достаточно до void*.

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

reinterpret_cast используется для преобразований между несвязанными типами. В твоем случае - из указателя int[10]* в число size_t.

Тип size_t определен в заголовке stddef.h.
« Последнее редактирование: 14-12-2010 07:21 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Balabek
Новенький

kz
Offline Offline

« Ответ #2 : 14-12-2010 08:40 » 

Спасибо!
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 16-12-2010 11:55 » 

Дорогие программисты! Я не студент. Я изучаю Си++ ради собственного интереса, так сказать люблю все знать )), и вданный момент читаю книгу Эккеля по Cи++. Столкнулся в книге с такой задачей:
Определите массив типа int. Получите начальный адрес массива и приведите его к типу void* при помощи оператора static_cast. Напишите функцию, в аргументах которой передаются void*, число (количество байтов) и значение. Функция должна присваивать передаваемое значение каждому байту в заданном интервале.
Решил первую часть:
int m1[10];
cout<<"Adress m: "<<(long) m1<<endl;
void* m2=static_cast<void*>(m1);
Не могу написать функцию ))
и почему каждому байту когда размер m2 4 байта. Если это даже глупый вопрос, подскажите хотя бы как найти ответ ))

Вы как-то странно берете адрес первого элемента массива. Первый элемент - это m1[0], его адрес &m1[0]. В принципе, это делать необязательно, так как в С++ есть стандартное неявное приведение (standard implicit cast) имя массива к указателю на первый элемент с индексом 0.

В первой части задачи Эккель хочет, чтобы вы написали static_cast<void*>(m1)

Вторая часть должна выглядеть так:
Код:
void fill(void* void_ptr, size_t count, unsigned char value) {
    unsigned char * ptr = static_cast<unsigned char*>(void_ptr);
    for (size_t i = 0; i < count; i++) {
        ptr[i] = value;
    }
}
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines