Реализация библиотеки для создания и управления пользовательской кучей - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Привет всем. Как я понял, мне нужно реализовать процедуры new и dispose. Я в течении недели искал информацию и в книгах и в интернете и нигде не нашел годную информацию кроме этого : В программе на языке Паскаль информацию в основной памяти ЭВМ можно хранить еще одним способом. Он заключается в использовании глобальных или локальных переменных, включая массивы и записи, которые предусмотрены в языке Паскаль. Глобальные переменные занимают постоянное место в памяти во время выполнения программы. Для локальных переменных память выделяется из стека ЭВМ. Хотя управление глобальными и локальными переменными на Паскале реализовано эффективно, программист должен знать заранее объем необходимой памяти для каждого конкретного случая. Я пытался через массив выделять память для структур данных с помощью указателей, но я все равно не понял и не добился результата. Пожалуйста, объясните мне поэтапно как можно эти процедуры реализовать в библиотеке.

Решение задачи: «Реализация библиотеки для создания и управления пользовательской кучей»

textual
Листинг программы
type
  TItem = record
    idx, size: Word;
  end;
var
  pool: array [0..16383] of Word; { отсюда будем выдавать куски }
  MemList, FreeList: array [0..1023] of TItem; { можем выделить/вернуть не больше 1024 блоков }
  ml, fl: Integer;  { счетчики элементов в MemList и FreeList }
 
procedure Init;
begin
  ml:=0; 
  fl:=1; FreeList[0].idx:=0; FreeList[0].size:=Length(pool); { пустой блок размером во весь пул }
end;
 
procedure myGetMem(var p: Pointer; size: Word);
var i: Integer;
begin
  p:=nil;
  if (size=0) or (fl>High(FreeList)) then Exit;
  size:=(size+1) div 2;                                     { пересчитали на размер Word }
  i:=0; while (i<fl) and (size>FreeList[i].size) do Inc(i); { ищем свободный блок нужного размера }
  if i=fl then Exit;                                        { не нашли }
  p:=@(pool[FreeList[i].idx]);                              { указатель на память из нашего пула }
  MemList[ml].idx:=FreeList[i].idx; MemList[ml].size:=size; Inc(ml); { добавили в список занятых }
  Inc(FreeList[i].idx,size); Dec(FreeList[i].size,size);    { уменьшили свободный блок }
  if FreeList[i].size=0 then begin                          { сразу удалим пустой блок из списка }
    Dec(fl); for i:=i to fl do FreeList[i]:=FreeList[i+1];
  end;
end;

Объяснение кода листинга программы

  1. Объявлены типы данных: TItem = record (структура) с полями idx, size: Word; Var: pool: array [0..16383] of Word; (массив на 16384 слова, для хранения памяти) MemList, FreeList: array [0..1023] of TItem; (массивы на 1024 элемента, для учета выделенных и свободных блоков) ml, fl: Integer; (счетчики элементов в MemList и FreeList)
  2. Определена процедура Init; (инициализация)
  3. В процедуре Init, счетчики ml и fl инициализируются нулями и единицей соответственно. Блок размером во весь пул добавляется в FreeList.
  4. В процедуре myGetMem, если размер запрашиваемой памяти равен нулю или счетчик свободных блоков превышает максимальный индекс, то процедура завершается. Размер запрашиваемой памяти округляется в меньшую сторону до ближайшего слова. В цикле while, идет поиск первого свободного блока нужного размера в массиве FreeList. Если такой блок найден, то из пула выделяется память по найденному индексу, и блок добавляется в MemList. Индекс и размер найденного блока обновляются в массиве FreeList. Если в процессе поиска свободных блоков, размер запрашиваемой памяти был уменьшен до нуля, то найденный блок удаляется из массива FreeList.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5
Похожие ответы