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

Delphi Sources



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

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

Да не, задание, на самом деле, достаточно простое.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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.
Ответить с цитированием
 


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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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