Показать сообщение отдельно
  #16  
Старый 10.11.2016, 23:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия 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;

Ну и т.д.
Ответить с цитированием