找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 7751|回复: 2

【VB】基于数组的内存管理

[复制链接]

9

主题

10

回帖

451

积分

用户组: 中·技术宅

UID
5181
精华
3
威望
39 点
宅币
260 个
贡献
79 次
宅之契约
0 份
在线时间
42 小时
注册时间
2019-7-25
发表于 2020-11-7 23:24:06 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 天马座 于 2020-11-7 23:31 编辑

众所周知VB没有指针对象,很多语言也没有指针对象,导致编写链式存储结构很麻烦,但是VB有数组,并且一般情况编写链式存储结构的数据类型的成员都是固定的完全可以使用数组实现,那么数组的索引就相当于内存地址,
比如一个树的节点可以写成如下形式
Dim mem() As TreeNode
debug.print mem(p).key '索引相当于地址 mem数组相当于整个内存
那么我们只需要对数组的规模和索引进行有效的管理就可以了
如果还是不明白可以参考 算法导论 第10章 10.3 指针和对象实现
下面是我封装好的一个类,大家可以直接拿去使用,类外绑定一下数据类型就可以
手机打字有点费劲 例子就不写了,自行脑补
  1. Private Const START_HEADER = 0
  2. Private header As Long, allocCount As Long, last As Long
  3. Private nextFree() As Long
  4. Private Sub Class_Initialize()
  5.     Call clear
  6. End Sub
  7. Private Sub Class_Terminate()
  8.     Erase nextFree
  9. End Sub
  10. Public Property Get count() As Long
  11.     count = allocCount
  12. End Property
  13. Public Property Get capacity() As Long
  14.     capacity = last - START_HEADER
  15. End Property
  16. Public Sub clear()
  17.     allocCount = 0
  18.     header = START_HEADER
  19.     last = START_HEADER + 1
  20.     ReDim nextFree(START_HEADER To last - 1)
  21.     nextFree(header) = last
  22. End Sub
  23. Public Function alloc() As Long
  24.     '分配一个自由的索引
  25.     If header = last Then
  26.         Call doubleCapacity
  27.     End If
  28.     Dim result As Long
  29.     result = header
  30.     header = nextFree(header)
  31.     nextFree(result) = START_HEADER - 1
  32.     allocCount = allocCount + 1
  33.     alloc = result
  34. End Function
  35. Public Function free(ByVal p As Long) As Boolean
  36.     '把索引标记成自由
  37.     If p < START_HEADER Or p >= last Then
  38.         free = False
  39.         Exit Function
  40.     End If
  41.     If nextFree(p) >= START_HEADER Then
  42.         free = False
  43.         Exit Function
  44.     End If
  45.     nextFree(p) = header
  46.     header = p
  47.     allocCount = allocCount - 1
  48.     free = True
  49. End Function
  50. Private Sub doubleCapacity()
  51.     last = START_HEADER + (last - START_HEADER) * 2
  52.     ReDim Preserve nextFree(START_HEADER To last - 1)
  53.     Dim i As Long
  54.     For i = header To last - 1
  55.         nextFree(i) = i + 1
  56.     Next
  57. End Sub
复制代码

本帖被以下淘专辑推荐:

回复

使用道具 举报

1112

主题

1652

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24251 个
贡献
46222 次
宅之契约
0 份
在线时间
2298 小时
注册时间
2014-1-26
发表于 2020-11-7 23:52:51 | 显示全部楼层
VB没有“指针对象”,C语言和C++也没有。

但,VB有对象,有类,使用对象和类可以实现链式结构,并不麻烦。并且还自带引用计数,就像C++的智能指针shared_ptr一样。

参考我使用VB6实现AVL二分查找树:
https://www.0xaa55.com/thread-25770-1-1.html
回复 赞! 靠!

使用道具 举报

9

主题

10

回帖

451

积分

用户组: 中·技术宅

UID
5181
精华
3
威望
39 点
宅币
260 个
贡献
79 次
宅之契约
0 份
在线时间
42 小时
注册时间
2019-7-25
 楼主| 发表于 2020-11-8 00:02:00 | 显示全部楼层
0xAA55 发表于 2020-11-7 23:52
VB没有“指针对象”,C语言和C++也没有。

但,VB有对象,有类,使用对象和类可以实现链式结构,并不麻烦。 ...

用类编写代码有点丑 判空和赋值 有点啰嗦
比如查找最小节点,数组版代码如下,更加接近c风格
  1. Private Function getFirstEntry() As Long
  2.     Dim p As Long
  3.     p = root
  4.     If p <> NULL_PTR Then
  5.         Do While leftChild(p) <> NULL_PTR
  6.             p = leftChild(p)
  7.         Loop
  8.     End If
  9.     getFirstEntry = p
  10. End Function
复制代码
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-26 05:36 , Processed in 0.049720 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表