Реализация библиотеки для создания и управления пользовательской кучей - 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;
Объяснение кода листинга программы
- Объявлены типы данных: 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)
- Определена процедура Init; (инициализация)
- В процедуре Init, счетчики ml и fl инициализируются нулями и единицей соответственно. Блок размером во весь пул добавляется в FreeList.
- В процедуре myGetMem, если размер запрашиваемой памяти равен нулю или счетчик свободных блоков превышает максимальный индекс, то процедура завершается. Размер запрашиваемой памяти округляется в меньшую сторону до ближайшего слова. В цикле while, идет поиск первого свободного блока нужного размера в массиве FreeList. Если такой блок найден, то из пула выделяется память по найденному индексу, и блок добавляется в MemList. Индекс и размер найденного блока обновляются в массиве FreeList. Если в процессе поиска свободных блоков, размер запрашиваемой памяти был уменьшен до нуля, то найденный блок удаляется из массива FreeList.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д