struct RGB_BITMAP
{
WORD width; // Ширина
WORD height; // Высота
WORD uwidth; // Используемая ширина
WORD uheight; // Используемая высота
BYTE Tail; // Хвост в конце строки
LONG BufSize; // Размер цветового буфера
RGB_PIXEL * Data; // Данные о цвете
virtual ~RGB_BITMAP(){
free(Data);
Data = NULL;};
};
RGB_BITMAP m_Bmp;
BYTE *m_arrpMapsRGB[3];
void ColorMaps ()
{
int i,j,k=0;
BYTE *R,*G, *B;
BYTE *p=(BYTE*)m_Bmp.Data;//Данные о цвете
BYTE MemSize=sizeof(BYTE)*m_Bmp.uwidth*m_Bmp.uheight;
R=(BYTE*)malloc(sizeof(MemSize));
G=(BYTE*)malloc(sizeof(MemSize));
B=(BYTE*)malloc(sizeof(MemSize));
SHORT Tail=m_Bmp.Tail+(m_Bmp.width-m_Bmp.uwidth)*sizeof(RGB_PIXEL);
for (i=0;i<m_Bmp.uheight;i++)
{
for (j=0;j<m_Bmp.uwidth;j++)
{
B[k]=p[0];
G[k]=p[1];
R[k]=p[2];
p+=sizeof(RGB_PIXEL);
k++;
};
p+=Tail; // пропускаем концевой хвост
};
m_arrpMapsRGB[0]=R;
m_arrpMapsRGB[1]=G;
m_arrpMapsRGB[2]=B;
};
Определения R,G,B цветов из BMP
Код:
Код компилируется, но при запуске пишет ошибка сегментирования. т.е. выход за предел массива. А где именно происходит, не могу понять.
1. Вместо :
Код:
RGB_PIXEL * Data; // Данные о цвете
Я прописал:
Код:
BYTE * Data; // Данные о цвете
2. Вместо:
Код:
R=(BYTE*)malloc(sizeof(MemSize));
G=(BYTE*)malloc(sizeof(MemSize));
B=(BYTE*)malloc(sizeof(MemSize));
G=(BYTE*)malloc(sizeof(MemSize));
B=(BYTE*)malloc(sizeof(MemSize));
Надо было:
Код:
R=(BYTE*)malloc(MemSize);
G=(BYTE*)malloc(MemSize);
B=(BYTE*)malloc(MemSize);
G=(BYTE*)malloc(MemSize);
B=(BYTE*)malloc(MemSize);
Но, все равно где-то есть ошибка.
Откройте для себя дебаггер
А, собственно, что надо то? Что именно должен делать код?
Кажется тут я уже всё разобрался. Спасибо всем, что откликнулись. Код должен был выделить три цвета R,G,B и положить их в массив m_arrpMapsRGB[].
Все же тут есть ошибка. Т.е. мне кажется, что объект кончается не дожидая до конца цикла и указатель указывает на пустой объект или вне предела объекта..
Вместо:
Код:
BYTE MemSize=sizeof(BYTE)*m_Bmp.uwidth*m_Bmp.uheight;
Надо было:
Код:
int MemSize=sizeof(BYTE)*m_Bmp.uwidth*m_Bmp.uheight;
Только вот зачем так часто дёргать malloc, тогда как можно сделать так:
Код:
R=(BYTE*)malloc(sizeof(MemSize)*3);
G=R+sizeof(MemSize);
B=G+sizeof(MemSize);
G=R+sizeof(MemSize);
B=G+sizeof(MemSize);
Код:
R=(BYTE*)malloc(sizeof(MemSize)*3);
G=R+sizeof(MemSize);
B=G+sizeof(MemSize);
G=R+sizeof(MemSize);
B=G+sizeof(MemSize);
Так не работает.
Код:
BYTE *p=(BYTE*)m_Bmp.Data;//Данные о цвете;
А где m_Bmp.Data берется? Где код заполнения m_Bmp ?
Цитата: sqwerty
Код:
R=(BYTE*)malloc(sizeof(MemSize)*3);
G=R+sizeof(MemSize);
B=G+sizeof(MemSize);
G=R+sizeof(MemSize);
B=G+sizeof(MemSize);
Так не работает.
Ну да, поспешил, и не везде поправил копипасту. :) Сорри... Надо так:
Код:
R=(BYTE*)malloc(MemSize*3);
G=R+sizeof(MemSize);
B=G+sizeof(MemSize);
G=R+sizeof(MemSize);
B=G+sizeof(MemSize);
Да и эту строчку
Код:
BYTE MemSize=sizeof(BYTE)*m_Bmp.uwidth*m_Bmp.uheight;
Надо бы изменить на такую.
Код:
int MemSize=sizeof(BYTE)*m_Bmp.uwidth*m_Bmp.uheight;
Или 256 байт памяти хватит всем? ;)
Да и sizeof(BYTE), по моему, там лишнее. А значит так:
Код:
int MemSize=m_Bmp.uwidth*m_Bmp.uheight;
Хотя, это уже дело вкуса. :)