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

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

ua
Offline Offline

« : 31-08-2009 13:21 » 

Добрый день!Я пишу функцию которая считывает в память рисунок и заполняет массив значениями цвета пикселов...но при выделении памяти для буфера ничего не происходит...
Вот функция:
Код:
int LoadBitmapFile(BITMAP_FILE_PTR bitmap, char* filename)
{
FILE *file;

file=fopen(filename, "r");

fread(&bitmap->bitmapfileheader,sizeof(BITMAPFILEHEADER),1,file);
fread(&bitmap->bitmapinfoheader,sizeof(BITMAPINFOHEADER),1,file);
fseek(file,-(int)(bitmap->bitmapinfoheader.biSize),SEEK_END);

if(bitmap->bitmapinfoheader.biBitCount == 24)
{


bitmap->buffer = new UCHAR[bitmap->bitmapinfoheader.biSizeImage];//<<<<<


if(bitmap->buffer == NULL)
{
fclose(file);
MessageBox(hwnd_main, L"Память не выделена!", L"Ошибка", NULL);
return(-1);
}

fread(&bitmap->buffer,sizeof(bitmap->bitmapinfoheader.biSizeImage),1,file);
}

fclose(file);
return(0);
}
а это структура для bitmap:
Код:
typedef struct BITMAP_FILE_TAG
{
BITMAPFILEHEADER bitmapfileheader;  // this contains the bitmapfile header
BITMAPINFOHEADER bitmapinfoheader;  // this is all the info including the palette
PALETTEENTRY     palette[256];      // we will store the palette here
UCHAR            *buffer;           // this is a pointer to the data
} BITMAP_FILE, *BITMAP_FILE_PTR;
« Последнее редактирование: 31-08-2009 16:10 от Алексей1153++ » Записан
Джон
просто
Администратор

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

« Ответ #1 : 31-08-2009 13:31 » 

А что должно происходить?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
larry
Участник

ua
Offline Offline

« Ответ #2 : 31-08-2009 14:07 » 

должна выделиться память в строке bitmap->buffer = new UCHAR[bitmap->bitmapinfoheader.biSizeImage]; и потом считать в этот массив значение пикселей картинки,но программа выдает,что "память не выделена" и выдает ошибки при попытке считать данные из bitmap->buffer
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #3 : 31-08-2009 15:34 » 

попробуй перед if выведи значение bitmap->bitmapinfoheader.biSizeImage

как у тебя происходит считывание из невыделенного буфера?
« Последнее редактирование: 31-08-2009 15:36 от Mayor » Записан

1n c0de we trust
larry
Участник

ua
Offline Offline

« Ответ #4 : 31-08-2009 15:51 » 

 bitmap->bitmapinfoheader.biSizeImage = 15002, т.е. как раз размер картинки(15кБ)...заголовок нормально считывается,только буфер не выделяется...
Записан
larry
Участник

ua
Offline Offline

« Ответ #5 : 31-08-2009 16:00 » 

при попытке считывания останавливается программа и выдает сообщении об ошибке при попытке считать данные по нулевому адресу...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 31-08-2009 16:22 » 

larry, у тебя C используется ?

Если нет, вот вот это всё, только гораздо красивее Улыбаюсь

А код рабочий - у меня всё выделяется
Код:
struct BITMAP_FILE_TAG
{
private:
BITMAPFILEHEADER bitmapfileheader;  // this contains the bitmapfile header
BITMAPINFOHEADER bitmapinfoheader;  // this is all the info including the palette
PALETTEENTRY     palette[256];      // we will store the palette here
UCHAR            *buffer;           // this is a pointer to the data

public:
int LoadBitmapFile(const char* filename,HWND hWnd=0)
{
FILE* file=fopen(filename, "r");

fread(&bitmapfileheader,sizeof(bitmapfileheader),1,file);
fread(&bitmapinfoheader,sizeof(bitmapinfoheader),1,file);
fseek(file,-(int)(bitmapinfoheader.biSize),SEEK_END);

if(bitmapinfoheader.biBitCount == 24)
{
buffer = new UCHAR[bitmapinfoheader.biSizeImage];//<<<<<

if(!buffer)
{
fclose(file);
if(hWnd)
{
MessageBox(hWnd, _T("Память не выделена!"), _T("Ошибка"), 0);
}
return(-1);
}

fread(&buffer,sizeof(bitmapinfoheader.biSizeImage),1,file);
}

fclose(file);
return(0);
}

void DeleteBuffer()
{
if(buffer)
{
delete buffer;
buffer=0;
}
}

~BITMAP_FILE_TAG()
{
DeleteBuffer();
}
};
« Последнее редактирование: 01-09-2009 08:31 от Алексей1153++ » Записан

larry
Участник

ua
Offline Offline

« Ответ #7 : 31-08-2009 16:42 » 

БОЛЬШОЕ СПАСИБО!!!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 31-08-2009 17:17 » 

эээ, так в чём причина то была ? Я же ничего не менял в топологии кода Улыбаюсь
Записан

larry
Участник

ua
Offline Offline

« Ответ #9 : 31-08-2009 17:26 » 

до сих пор не могу разобраться Улыбаюсь...как ни странно,но работает:)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 31-08-2009 17:47 » 

остаётся только , что ты как-то неправильно передавал параметры в функцию. Поскольку работал и исходняй код, до заворачивания в класс
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 01-09-2009 08:32 » 

larry, кстати, я ступил немного - параметр bitmap не нужен в функции. Я подправил пост
Записан

larry
Участник

ua
Offline Offline

« Ответ #12 : 02-09-2009 10:56 » 

спасибо...я уже заново переписал и все работает...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines