技术宅的结界

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

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 171|回复: 2
收起左侧

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

[复制链接]

6

主题

13

帖子

377

积分

用户组: 中·技术宅

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

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

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

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

众所周知VB没有指针对象,很多语言也没有指针对象,导致编写链式存储结构很麻烦,但是VB有数组,并且一般情况编写链式存储结构的数据类型的成员都是固定的完全可以使用数组实现,那么数组的索引就相当于内存地址,
比如一个树的节点可以写成如下形式
Dim mem() As TreeNode
debug.print mem(p).key '索引相当于地址 mem数组相当于整个内存
那么我们只需要对数组的规模和索引进行有效的管理就可以了
如果还是不明白可以参考 算法导论 第10章 10.3 指针和对象实现
下面是我封装好的一个类,大家可以直接拿去使用,类外绑定一下数据类型就可以
手机打字有点费劲 例子就不写了,自行脑补
[Visual Basic] 纯文本查看 复制代码
Private Const START_HEADER = 0
Private header As Long, allocCount As Long, last As Long
Private nextFree() As Long
Private Sub Class_Initialize()
    Call clear
End Sub
Private Sub Class_Terminate()
    Erase nextFree
End Sub
Public Property Get count() As Long
    count = allocCount
End Property
Public Property Get capacity() As Long
    capacity = last - START_HEADER
End Property
Public Sub clear()
    allocCount = 0
    header = START_HEADER
    last = START_HEADER + 1
    ReDim nextFree(START_HEADER To last - 1)
    nextFree(header) = last
End Sub
Public Function alloc() As Long
    '分配一个自由的索引
    If header = last Then
        Call doubleCapacity
    End If
    Dim result As Long
    result = header
    header = nextFree(header)
    nextFree(result) = START_HEADER - 1
    allocCount = allocCount + 1
    alloc = result
End Function
Public Function free(ByVal p As Long) As Boolean
    '把索引标记成自由
    If p < START_HEADER Or p >= last Then
        free = False
        Exit Function
    End If
    If nextFree(p) >= START_HEADER Then
        free = False
        Exit Function
    End If
    nextFree(p) = header
    header = p
    allocCount = allocCount - 1
    free = True
End Function
Private Sub doubleCapacity()
    last = START_HEADER + (last - START_HEADER) * 2
    ReDim Preserve nextFree(START_HEADER To last - 1)
    Dim i As Long
    For i = header To last - 1
        nextFree(i) = i + 1
    Next
End Sub

本帖被以下淘专辑推荐:

回复

使用道具 举报

1072

主题

2492

帖子

6万

积分

用户组: 管理员

一只技术宅

UID
1
精华
223
威望
420 点
宅币
20164 个
贡献
41913 次
宅之契约
0 份
在线时间
1908 小时
注册时间
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

6

主题

13

帖子

377

积分

用户组: 中·技术宅

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

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

用类编写代码有点丑 判空和赋值 有点啰嗦
比如查找最小节点,数组版代码如下,更加接近c风格
[Visual Basic] 纯文本查看 复制代码
Private Function getFirstEntry() As Long
    Dim p As Long
    p = root
    If p <> NULL_PTR Then
        Do While leftChild(p) <> NULL_PTR
            p = leftChild(p)
        Loop
    End If
    getFirstEntry = p
End Function

本版积分规则

QQ|申请友链||Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图  

GMT+8, 2020-11-28 04:47 , Processed in 0.093877 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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