Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с функцией 
:(
    Опции темы
max_crt
  Дата 20.7.2003, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 10.7.2003

Репутация: нет
Всего: 1



Подскажите, пожайлуста, что означает строка кода
Код
lpbi = (LPBITMAPINFOHEADER)hDIB;
в тексте следующей функции:

Код

// WriteDIB  - Writes a DIB to file
// Returns  - TRUE on success
// szFile  - Name of file to write to
// hDIB   - Handle of the DIB
BOOL WriteDIB( LPTSTR szFile, HANDLE hDIB)
{
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi;

if (!hDIB)
 return FALSE;

CFile file;
if( !file.Open( szFile, CFile::modeWrite|CFile::modeCreate) )
 return FALSE;

lpbi = (LPBITMAPINFOHEADER)hDIB;

int nColors = 1 << lpbi->biBitCount;

// Fill in the fields of the file header
hdr.bfType  = ((WORD) ('M' << 8) | 'B'); // is always "BM"
hdr.bfSize  = GlobalSize (hDIB) + sizeof( hdr );
hdr.bfReserved1  = 0;
hdr.bfReserved2  = 0;
hdr.bfOffBits  = (DWORD) (sizeof( hdr ) + lpbi->biSize +
     nColors * sizeof(RGBQUAD));

// Write the file header
file.Write( &hdr, sizeof(hdr) );

// Write the DIB header and the bits
file.Write( lpbi, GlobalSize(hDIB) );

return TRUE;
}


Мне новичку в C++ честно говоря не понятно что же именно присваивается lpbi confused.gif


PM MAIL   Вверх
RAN
Дата 20.7.2003, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Это операция приведения к типу. Имеет два вида, эквивалентных по смыслу:
(тип)переменная
тип(выражение)

Некоторые типы компилятор приводит сам и без предупреждений (например, float к double)
Некоторые тоже переводит, но выводит предупреждение (например, double к float или int к unsigned)
А некоторые надо преобразовывать самому, как в твоём примере, чтоб компилятор мог отслеживать ошибки. Ты получаешь в hDIB переменную типа HANDLE, void* по сути, указатель на ничто, а на самом деле в контексте данной функции это указатель на структуру BITMAPINFOHEADER.

Кстати, это устаревшая форма записи, которую я правда обычно и использую (привык понимаешь). Однако она ограничена в возможностях. Например, ты не сможешь перевести тип const к не const. Поэтому я тебе советую пока ты не привык к старому, сразу изучать новое. Посмотри static_cast (это аналог описанной выше формы), dynamic_cast, reinterpret_cast.

PM MAIL ICQ   Вверх
max_crt
Дата 20.7.2003, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 10.7.2003

Репутация: нет
Всего: 1



RAN Я правильно понял:
hDIB - в данном контексте это указатель на структуру, которая будет преобразована к типу LPBITMAPINFOHEADER, а
lpbi - это указатель на структуру LPBITMAPINFOHEADER в которую была преобразована hDIB?

PM MAIL   Вверх
RAN
Дата 20.7.2003, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



ИМХО, ты не правильно себе это представляешь. С самой структурой ничего происходить не будет. Структура расположена где-то в памяти по адресам, скажет, от A до B. Вторым пораметром функции передаётся ссылка на эту структуру, по сути значение A. Но этот параметр определён как HANDLE, то есть указатель на какую-то область памяти. Как прикажешь компилятору понимать на что этот пораметр указывает. Так вот, чтобы получить доступ к полям структуры надо преобразовать тип:

hDIB->biSize //ошибка, hDIB - это просто void*
LPBITMAPINFOHEADER(hDIB)->biSize //всё OK

На самом деле при статическом преобразовании в код ничего не пишется.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0428 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.