Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2009, 20:29   #1
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию Массив TBitmap (C++ Builder)

Доброго времени суток!
Возникла у меня такая странная проблема - при создании динамического массива из TBitmap вылетает ошибка на этапе исполнения, мол "Access violation at address 00000000. Read of address 00000000"
Код, казалось бы, совершенно безобидный:
Код:
Graphics::TBitmap* img = new Graphics::TBitmap[2];
Единичные TBitmap такого сюрприза как будто бы не подкидывают...
Откуда бы могла взяться такая проблема?
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 10.11.2009, 00:14   #2
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

билдеродним словом...

Код:
Graphics::TBitmap** img = new Graphics::TBitmap*[2];
вообще можно делать как написано в вашем коде, но видимо не по отношению к классам в билдере.


З.Ы. stilet, вот ешо причина

Последний раз редактировалось lennon; 10.11.2009 в 00:53.
lennon вне форума Ответить с цитированием
Старый 10.11.2009, 15:23   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Хмм... Неладное что-то творится...
Код:
Graphics::TBitmap** img = new Graphics::TBitmap*[4];
(*img) -> Height = 10;
или даже
Код:
Graphics::TBitmap** img = new Graphics::TBitmap*;
(**img).LoadFromFile("C:\\1.bmp");
выдает аналогичную ошибку на второй строке...
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 10.11.2009, 15:35   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Никаких проблем:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Graphics::TBitmap *b=new Graphics::TBitmap;
  b->Width=20;
  b->Height=20;
  b->Canvas->LineTo(10,10);
  BitBlt(Form1->Canvas->Handle,0,0,100,100,b->Canvas->Handle,0,0,SRCCOPY);
  delete b;
}
//--
Пардон, я поравлюсь...
Работает как часы никаких AV нет
Цитата:
вот ешо причина
Не холливарь, прошу. Это совершенно бессмысленно.
I'm learning to live...

Последний раз редактировалось Stilet; 10.11.2009 в 15:38.
Stilet вне форума Ответить с цитированием
Старый 10.11.2009, 16:31   #5
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Нет, с одним экземпляром у меня как раз проблем нет. Неприятности начинаются, например, если сделать
Код:
Graphics::TBitmap *b=new Graphics::TBitmap[];
Run-time error прямо на этой же строчке.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 10.11.2009, 16:36   #6
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

вы же создали массив классов.
теперь каждый элемента массива нужно инициализвароть.
Код:
Graphics::TBitmap** img = new Graphics::TBitmap*[2];
img[0] = new Graphics::TBitmap;
img[1] = new Graphics::TBitmap;
lennon вне форума Ответить с цитированием
Старый 10.11.2009, 16:54   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
теперь каждый элемента массива нужно инициализвароть.
Вот именно, и проблем с этим ну никак нет
Код:
{
	Graphics::TBitmap *b[2];
  for (int i = 0; i < 2; i++) {
	  b[i]=new Graphics::TBitmap;
	  b[i]->Width=20;
	  b[i]->Height=20;
	  b[i]->Canvas->LineTo(10,10);
  }

  BitBlt(Form1->Canvas->Handle,0,0,100,100,b[0]->Canvas->Handle,0,0,SRCCOPY);
  BitBlt(Form1->Canvas->Handle,20,20,100,100,b[1]->Canvas->Handle,0,0,SRCCOPY);
  //b->Canvas->Draw(0,0,PaintBox1->Canvas->);
  //PaintBox1->Canvas->CopyRect(PaintBox1->Canvas->ClipRect,b->Canvas,b->Canvas->ClipRect);
  for (int i = 0; i < 2; i++) {
   delete b[i]   ;
  }
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.11.2009, 08:21   #8
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Точно!)))
Проинициализировал - работает!)
Большое спасибо!
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 09.02.2011, 21:35   #9
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Хм... а если массив не статический, а динамический? (инициализировать до бесконечности?) Как выйти из положения? Делаю, как написано в этой теме, при закрытии формы, ошибка при обращении к памяти...
P.S. Пардон вопрс снимается, я действительно обращался к несуществующему элементу)
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 09.02.2011 в 21:39.
ImmortalAlexSan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ImageList + TBitMap = ... Alex Cones Мультимедиа в Delphi 4 08.07.2009 14:00
TBitmap и указатели Levsha100 Общие вопросы C/C++ 3 17.05.2009 22:36
движение TBitMap Juffin Мультимедиа в Delphi 1 14.04.2009 21:34
Массив TBitmap, "Недостаточно памяти для обработки команды" Роман Радер Мультимедиа в Delphi 5 05.04.2009 18:14
TBitmap odi_noki Мультимедиа в Delphi 17 25.10.2008 09:53