📄 memory.bas
字号:
mcbe(i).big = mcbu(num).big
j = emptym
k = j
total = 0
Do While j <> 0 '确定插入位置
If mcbe(j).Start < mcbe(i).Start Then
total = total + 1
If total = 13 Then
freemm = -1
MsgBox ("freemm错误 确定插入位置"), 0, "error"
Exit Function
End If
k = j
j = mcbe(j).next
Else
Exit Do
End If
Loop
If k = j Then '插到最前面
If mcbe(i).Start + mcbe(i).big = mcbe(k).Start Then '与后一项合并
mcbe(k).big = mcbe(i).big + mcbe(k).big
mcbe(k).Start = mcbe(i).Start
mcbe(i).flag = False
mcbe(i).next = 0
mcbe(i).prior = 0
Exit Function
Else '不能合并
mcbe(i).prior = 0
mcbe(i).next = k
mcbe(k).prior = i
emptym = i
mcbe(i).flag = True
Exit Function
End If
Else
If j = 0 Then '插到最后
If (mcbe(k).Start + mcbe(k).big = mcbe(i).Start) Then '与前一项合并
mcbe(k).big = mcbe(k).big + mcbe(i).big
mcbe(i).next = 0
mcbe(i).prior = 0
mcbe(i).flag = False
Exit Function
Else '不能合并
mcbe(i).next = 0
mcbe(i).prior = k
mcbe(k).next = i
mcbe(i).flag = True
Exit Function
End If
Else '插到中间
If (mcbe(k).Start + mcbe(k).big = mcbe(i).Start) Then '与前一项合并
mcbe(k).big = mcbe(k).big + mcbe(i).big
mcbe(i).next = 0
mcbe(i).prior = 0
mcbe(i).flag = False
If mcbe(k).Start + mcbe(k).big = mcbe(j).Start Then '与后一项合并
mcbe(k).big = mcbe(k).big + mcbe(j).big
mcbe(k).next = mcbe(j).next
If mcbe(j).next <> 0 Then 'j指向最后一项
mcbe(mcbe(j).next).prior = k
End If
mcbe(j).next = 0
mcbe(j).prior = 0
mcbe(j).flag = False
End If
Else
If mcbe(i).Start + mcbe(i).big = mcbe(j).Start Then '与后一项合并
mcbe(j).Start = mcbe(i).Start
mcbe(j).big = mcbe(j).big + mcbe(i).big
mcbe(i).next = 0
mcbe(i).prior = 0
mcbe(i).flag = False
Else
mcbe(k).next = i
mcbe(i).next = j
mcbe(i).prior = k
mcbe(j).prior = i
mcbe(i).flag = True
End If
End If
End If
End If
End If
End Function
Public Function jincou(total As Integer) As Integer '内存紧凑函数
Dim i As Integer, j As Integer, sum As Integer, k As Integer, total2 As Integer
i = usedm: j = emptym
total2 = 0
Do While i <> 0 And mcbe(j).next <> 0
If mcbu(i).Start > mcbe(j).Start Then
pcb(mcbu(i).numpcb).caddr = mcbe(j).Start '只改变地址不改变指针
sum = mcbe(j).Start + mcbu(i).big + 4
For k = mcbe(j).Start To sum Step 1
mmu(k) = mmu(k + mcbe(j).big)
Next k
mcbu(i).Start = mcbe(j).Start
mcbe(j).Start = mcbu(i).Start + mcbu(i).big
sum = mcbu(i).big + mcbu(i).Start - 1
sum = sum \ 4 - 1
For k = (mcbu(i).Start - 1) \ 4 To sum Step 1
frmmain.mmview(k).BackColor = frmmain.yiyong.BackColor
Next k
sum = mcbe(j).big + mcbe(j).Start - 1
sum = sum \ 4 - 1
For k = (mcbe(j).Start - 1) \ 4 To sum Step 1
frmmain.mmview(k).BackColor = frmmain.weiyong.BackColor
Next k
k = mcbe(j).next
If mcbe(j).Start + mcbe(j).big = mcbe(k).Start Then '与后项合并
mcbe(j).big = mcbe(j).big + mcbe(k).big
mcbe(k).flag = False
mcbe(j).next = mcbe(k).next
If mcbe(k).next <> 0 Then
mcbe(mcbe(k).next).prior = j
End If
mcbe(k).next = 0
mcbe(k).prior = 0
End If
Else
i = mcbu(i).next
End If
total2 = total2 + 1
If total2 = 23 Then
jincou = -1
Exit Function
End If
Loop
End Function
Public Sub refreemm() '内存回收错误后,再次回收
Dim i As Integer, j As Integer, k As Integer
For i = 1 To 11 Step 1
If mcbe(i).flag = True Then
k = emptyp
Do While k <> 0
If mcbe(k).Start = mcbe(i).Start Then '此块已存在于链表中
Exit Do
Else
k = mcbe(k).next
End If
Loop
If k = 0 Then '此块不在于链表中
j = emptym
k = j
Do While j <> 0 '找位置
If mcbe(j).Start < mcbe(i).Start Then
k = j
j = mcbe(j).next
Else
Exit Do
End If
Loop
If k = j Then '插到最前面
If mcbe(i).Start + mcbe(i).big = mcbe(k).Start Then '与后一项合并
mcbe(k).big = mcbe(i).big + mcbe(k).big
mcbe(k).Start = mcbe(i).Start
mcbe(i).flag = False
mcbe(i).next = 0
mcbe(i).prior = 0
Exit Sub
Else '不能合并
mcbe(i).prior = 0
mcbe(i).next = k
mcbe(k).prior = i
emptym = i
Exit Sub
End If
Else
If j = 0 Then '插到最后
If (mcbe(k).Start + mcbe(k).big = mcbe(i).Start) Then '与前一项合并
mcbe(k).big = mcbe(k).big + mcbe(i).big
mcbe(i).next = 0
mcbe(i).prior = 0
mcbe(i).flag = False
Exit Sub
Else '不能合并
mcbe(i).next = 0
mcbe(i).prior = k
mcbe(k).next = i
Exit Sub
End If
Else '插到中间
If (mcbe(k).Start + mcbe(k).big = mcbe(i).Start) Then '与前一项合并
mcbe(k).big = mcbe(k).big + mcbe(i).big
mcbe(i).next = 0
mcbe(i).prior = 0
mcbe(i).flag = False
If mcbe(k).Start + mcbe(k).big = mcbe(j).Start Then '与后一项合并
mcbe(k).big = mcbe(k).big + mcbe(j).big
mcbe(k).next = mcbe(j).next
If mcbe(j).next <> 0 Then 'j指向最后一项
mcbe(mcbe(j).next).prior = k
End If
mcbe(j).next = 0
mcbe(j).prior = 0
mcbe(j).flag = False
End If
Else
If mcbe(i).Start + mcbe(i).big = mcbe(j).Start Then '与后一项合并
mcbe(j).Start = mcbe(i).Start
mcbe(j).big = mcbe(j).big + mcbe(i).big
mcbe(i).next = 0
mcbe(i).prior = 0
mcbe(i).flag = False
Else
mcbu(k).next = i
mcbu(i).next = j
mcbu(i).prior = k
mcbu(j).prior = i
End If
End If
End If
End If
End If
End If
Next i
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -