| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Прокомментируйте код |
| Автор: anwe 9.7.2008, 19:16 | ||
Опишите (прокомментируйте), пожалуйста, эти строки:
4-я строка - это, что, сдвиг вправо на 3 разряда? В 5-ой строке понимаю идет выделение памяти, но ее размер байт что ли? Из условия задачи знаю, что bi.bmWidth и bi.bmHeight =200, то есть уже больше байта. Описание переменных, ясное дело, понятно. Меня интересует сам код. |
| Автор: anwe 9.7.2008, 20:04 | ||
| Уже лучше, а остальное? Нет не лучше: bi.bmWidth * bi.bmHeight * bpp однозначно больше байта, ведь
|
| Автор: system 9.7.2008, 20:22 |
это не конструктор а массив, какая разница что количество элементов больше 1 байта |
| Автор: anwe 9.7.2008, 20:26 | ||
Так, это понятно, просто в фразе
меня смутило что bi.bmWidth * bi.bmHeight * bpp - это элементы массива. А это его размер. Все, ясно. Что с остальными строками? Опишите!!! |
| Автор: system 9.7.2008, 21:11 | ||
|
| Автор: anwe 9.7.2008, 21:34 | ||||
По последним двум строкам кода уточнения:
Теперь переменная TransPixel также содержит указатель на вновь объявленный массив?
Наверное, приравнивание не самой себя а так: значение TransPixel отнимается от 32, сдвигается влево на 3 разряда и снова заносится в TransPixel. Верно? |
| Автор: bsa 9.7.2008, 22:29 | ||||
anwe
|
| Автор: mes 9.7.2008, 23:59 |
">> 3 " в данном случае выполняет роль целочисленного деления ( /8 ), результат которого будет минимальное кол-во байтов нужное для хранения одного пикселя. |
| Автор: system 10.7.2008, 01:51 | ||||||||
я тоже по спешке ошибся в этом месте, немного не так т.е. как уже сказали но исправлюсь в этом месте
равнозначен :
или еще проще
|
| Автор: anwe 10.7.2008, 21:45 | ||
| Спасибо всем, но есть но. Снова здорово:
выделяет массив байт и этот массив имеет размерность bi.bmWidth * bi.bmHeight * bpp. Раз выделяет память, значит результат ее - указатель. Вопрос: как он, указатель, может быть байтом? |
| Автор: varnie 10.7.2008, 22:12 |
| выделяется память под bi.bmWidth * bi.bmHeight * bpp байт, и в переменную pBits закидывается указатель на этот блок выделенной памяти. а сама переменная pBits является просто указателем на байт. в д. случае она указывает на начало выделенного блока. |
| Автор: JackYF 10.7.2008, 22:44 |
Указатель не байт, указатель указывает на байт |
| Автор: anwe 10.7.2008, 22:50 |
| То есть, BYTE показывает, что она указывает на первый байт выделенной памяти? Так это и так ясно, что указатель указывает на первый байт чего-либо. Что, значит, к примеру, BYTE *pBits указывает на первое двойное слово выделенной памяти? Если да, то как то странно, значение адреса ведь, что у байта что у двойного слова одно и переменная pBits в любом случае будет содержать один и тот же адрес. |
| Автор: varnie 10.7.2008, 22:57 |
| BYTE b; //переменная типа BYTE (т.е. unsigned char) BYTE *pByte //переменная, указывающая на байт. в мире виндовс есть также определенный тайпдеф(typedef), PBYTE -- это то же самое что и "BYTE *". pByte в данном случае указывает не на первое двойное слово памяти, а на первый байт аллоцированной памяти. cкажем, есть у нас BYTE *pByte = new BYTE[10]; если мы сделаем: DWORD pDword = (DWORD *)pByte; ++pDword; то мы сдвинемса от начала выделенного блока состоящего из 10 байт на 4 байта. т.е. "шагать" по памяти будем "4байтными" шагами если бы мы двигались имея изначальный pByte, то после ++pByte мы бы сдвинулись не на 4 байта, а лишь на один. |
| Автор: anwe 10.7.2008, 23:01 |
| Вопрос исчерпан. Спасибо. |
| Автор: varnie 10.7.2008, 23:08 |
| я чуть-чуть отредактировал свое предыдущее сообщение. прочти |
| Автор: anwe 11.7.2008, 00:22 |
| varnie, приблизительно такое пояснение я и ожидал и... если в этом и вся разница, то это просто мне к сведению. А уж как перемещаться по памяти - СООРИЕНТИРУЕМСЯ Тема закрыта! |