Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 10.11.2016, 23:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да не, задание, на самом деле, достаточно простое.
Код:
type
  PMemBlock = ^TMemBlock;
  TMemBlock = record
    StartAddr : Integer;
    BlockSize : Integer;
  End;

var
  PhisicalMem : Array [0..1023] Of Byte;
  MemBlocks : TList; // лень с массивами возиться

// Выделение памяти
function MM_GetMem(ASize : Integer) : Integer;
var
  I : Integer;
  B : PMemBlock;
begin
  Result := -1;
  If ASize < Length(PhisicalMem) Then 
    Begin
      // если нету еще выделенных блоков
      If MemBlocks.Count = 0 Then
        Begin
          New(B);
          B.StartAddr := Low(PhisicalMem);
          B.BlockSize := ASize;
          MemBlocks,Add(B);
          Result := B.StartAddr;
          Exit;
        End;
        
      //  Блоки есть, проверяем самое начало
      If MemBlocks[0].StartAddr > ASize Then
        Begin
          New(B);
          B.StartAddr := Low(PhisicalMem);
          B.BlockSize := ASize;
          MemBlocks,Add(B);
          Result := B.StartAddr;
          Exit;
        End;
       
      // Блоки есть, пробуем найти свободное место между блоками
      For I := 0 To MemBlocks.Count-2 Do
        If (MemBlocks[I+1].StartAddr - (MemBlocks[i].StartAddr + MemBlocks[i].BlockSize)) >= ASize Then
          Begin
            New(B);
            B.StartAddr := MemBlocks[i].StartAddr + MemBlocks[i].BlockSize + 1;
            B.BlockSize := ASize;
            MemBlocks.Insert(B,I+1);
            Result := B.StartAddr;
            Exit;
          End;
          
      // Пока не нашли. Смотрим в конец памяти
      If Result = -1 Then
        Begin
          If High() - (MemBlocks[MemBlocks.Count-1].StartAddr + MemBlocks[MemBlocks.Count-1].BlockSize) >= ASize Then
            Begin
              New(B);
              B.StartAddr := MemBlocks[i].StartAddr + MemBlocks[i].BlockSize + 1;
              B.BlockSize := ASize;
              MemBlocks.Insert(B,I+1);
              Result := B.StartAddr;
            End;
        End;
    end;
end;

// Освобождение памяти
function MM_FreeMem(AAddr : Integer) : Result;
var
  I : Integer;
  B : PMemBlock;
begin
  Result := -1;
  For I := 0 To MemBlocks.Count-1 Do
    If MemBlocks[i].startAddr = AAddr Then
      Begin
        B := MemBlocks[i];
        MemBlocks.Delete(I);
        Dispose(B);
        Result := I;
        Exit;
      End;
end;

Ну и т.д.

Последний раз редактировалось lmikle, 11.11.2016 в 08:16.
Ответить с цитированием
  #17  
Старый 13.11.2016, 19:48
theonewhocantbecalled theonewhocantbecalled вне форума
Прохожий
 
Регистрация: 05.11.2016
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

А что из себя строка
Код:
MemBlocks : TList;
представляет? Мы MemBlocks присваиваем значение какого-то списка, которого я нигде не нашел. TList это запись, в которой хранится нач. адрес и размер?
Ответить с цитированием
  #18  
Старый 13.11.2016, 19:51
theonewhocantbecalled theonewhocantbecalled вне форума
Прохожий
 
Регистрация: 05.11.2016
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Все, я прогуглил) "Класс TList очень полезный универсальный контейнер списков "
Ответить с цитированием
  #19  
Старый 13.11.2016, 21:10
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Все бы хорошо, но TList использует алгоритм, который собственно тут и изобретают
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #20  
Старый 13.11.2016, 21:56
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Num, не совсем. TList - это просто список каких-то данных.
Тут изобретают алгоритм управления ФИЗИЧЕСКОЙ памятью.

По поводу содания. Где-то в программе (например, при старте) надо создать это список, а потом, в конце работы, его уничтожить.
Ответить с цитированием
  #21  
Старый 14.11.2016, 08:11
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Да, TList это список, который для хранения элементов использует массив указателей, память для которого выделяется функцией ReallocMem, аналог которой в этой теме изобретают
protected procedure TList.SetCapacity
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #22  
Старый 14.11.2016, 09:14
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Только то,что привёл lmikle, использует дополнительную память.
Судя по заданию, все объекты типа MemBlock должны располагаться внутри массива PhisicalMem.
Ответить с цитированием
  #23  
Старый 14.11.2016, 23:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ок, что мешает, в принципе, выделить блок из PhisicalMem и в TList добавить указатель на него?
Или просто зарезервировать в начале какой-то кусок под таблицу, а для простоты сделать блоки фиксированного размера (как оно, соб-сно, и имплементировано в реальном мире - размер страницы 4К ни о чем не напоминает??? Или выравнивание на 16 байт??? Было бы желание, просто с 1К памяти особо не разбежишься)
Например, делаем блоки по 16 байт. Тогда макс мы можем выделить 1024/16 = 64 блока. Что бы адресовать 64 блока нам надо зарезервировать первые 64 байта для описателей (это если мы хотим все сделать по простому, т.е. не связваться с битовой арифметикой). Т.е. из 64 блоков 4 резервируем для служебных нужд. Тогда можно обойтись и без списка, но принципиально это ничего не поменяет.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:55.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter