Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Собственный диспетчер памяти для С/С++

35K
14 сентября 2008 года
artem90
6 / / 01.03.2008
Кто-нибудь имел дело с написанием диспетчера памяти ? Поделитесь пожалуйста исходниками, для ознакомления принципов работы. Нашел в инете неплохую статью. Но после прочтения осталось больше вопросов, чем ответов.

Диспетчер памяти понадобился не просто так, а по причине того, что ф-ии getimage() и putimage(), описанные в graphics.h, могут работать с экранной областью, размер которой <= 64K. И разрешение такой экранной области в режиме VGAHI приблизительно 350*350 пикселей, что довольно мало, для среднестатистического окна , перемещение которого планируется реализовать в GUI.

Заранее спасибо !
5
14 сентября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: artem90
Кто-нибудь имел дело с написанием диспетчера памяти ?

Гыым, помню 3 курс ИВТ, предмет "Операционные системы" - там таким спортом занимались.

Цитата: artem90
Диспетчер памяти понадобился не просто так, а по причине того, что ф-ии getimage() и putimage(), описанные в graphics.h, могут работать с экранной областью, размер которой <= 64K.

А как диспетчер памяти в этом случае может помочь?

1.6K
14 сентября 2008 года
Vov4ick
476 / / 01.02.2007
Это следствие сегментации памяти, нельзя непрерывно адресовать кусок памяти больше 64кб. Выходов можно придумать несколько, как простых - нарезать область экрана на куски по 64 кб, писать свои функции для вывода изображения, так и немного посложнее - использование расширенной памяти, переход к линейной адресации или защищённому режиму.
35K
14 сентября 2008 года
artem90
6 / / 01.03.2008
Цитата: Vov4ick
нарезать область экрана на куски по 64 кб


Vov4ick, а на счет этого можно поподробнее, пожалуйста. Потому что я пробовал вырезать фрагментами. Вот кусок кода:

Код:
long size;
   void far* buf1, far* buf2;
   
   // Выделение памяти для сохранения 1-ого фрагмента
   size = imagesize(0,0,220,220);
   buf1 = farmalloc(size);
   
   // для 2-ого фрагмента
   size = imagesize(220,0,440,220);
   buf2 = farmalloc(size);

   if(buf1 == NULL || buf2 == NULL)
   {
      cout<<"Not enough memory";
      getch();
      exit(1);
   }

//.....


Так вот при попытке выделить память для 2-ого фрагмента, farmalloc возвращает NULL, и вырезать фрагментами не получается :(
1.6K
14 сентября 2008 года
Vov4ick
476 / / 01.02.2007
А не в параграфах ли принимает функция выделения размер необходимого блока?
А вообще памяти достаточно? Из-под венды пускаете? Свойства программы нормально настроены?
35K
14 сентября 2008 года
artem90
6 / / 01.03.2008
Цитата: Vov4ick
А не в параграфах ли принимает функция выделения размер необходимого блока?


farmalloc, так же как и обычный malloc, принимает размер в байтах.

Цитата: Vov4ick
А вообще памяти достаточно? Из-под венды пускаете?


Запускаю из среды Borland C++ 3.11. ОС: WinXP SP2

Цитата: Vov4ick
Свойства программы нормально настроены?

Если вы имеете ввиду свойства среды, то в настройках модель памяти стоит Huge, Heap Size - 640K. Все остальные значения, связанные с памятью я тоже поставил на максимум.

1.6K
14 сентября 2008 года
Vov4ick
476 / / 01.02.2007
Я имею в виду параметры PIF файла с настройками NTVDM. Отключите динамическое выделение и выделите статически побольше.

Да, совсем забыл, не пользуйте getimage, это тормозно. При движении чего-либо по экрану, лучше выводить заново. Вообще анимация встроенными сишными функциями будет тормозной. Это я так, чтобы не было разочарований.
502
17 сентября 2008 года
Jail
550 / / 30.01.2007
Может будет полезным. :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог