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

Delphi Sources



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

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


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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