超级豆子!这个你做过没?[UP者有分]

boyzhang 2004-08-17 08:06:32
模拟垃圾回收,

我做了一个动态数组来模拟声明变量的过程,

比如:
Dim VariableLng() as long
Dim VariableTotal as long

如果新声明了一个整形变量,
就用这样的方法来生成一个新的变量
VariableTotal=VariableTotal+!
ReDim Preserve VariableLng(VariableTotal) as long

可,问题就出在这里,
如果已经声明了5个变量,
现在要把第2个变量销毁又不影响数组的连续性(因为有时要对数组用到枚举),
只能用重新排序的办法吗?

VB中没有链表,以前见过一位高人写过一个,不过效果不太理想.

或者那位高人还有什么别的好办法?

#不能用类,因为有时要用到枚举[按索引方式]
...全文
356 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
BlueDog 2004-08-21
  • 打赏
  • 举报
回复
写个VB快速链表--源代码算800元吧

如果你只是要解决你现在的动态数组方法的速度问题,保证能比以上几位的速度快很多.就算人民币300元吧 有源代码

付款方式,QQ上联系吧

不是缺这几个钱,我只是希望劳动得到别人的认可。
你留下邮箱,我先把执行文件寄给你,你比较一下,如果认可的话,就付款,我再发源码给你
VirtualAlloc 2004-08-21
  • 打赏
  • 举报
回复
还有钟方法是用另外一个数组来做“链表的指针”

例如:
Dim NextPtr() As Long
Dim Variable() As String

每个NextPtr() 元素的值 = 下个 Variable() 元素的指针,在VB里面要取变量的指针用 Varptr(i) 或 StrPtr(s) 的方法取得。
用这种方法以及上一种方法都会有个缺点,就是被删除的元素占用的资源没办法释放,如果时间长了,就需要重新整理(Defrag)一次数组的碎片了
VirtualAlloc 2004-08-21
  • 打赏
  • 举报
回复
提供你一种思路,使用另外一个数组作“指针”:

例如:
Dim idx() As Long
Dim Variable() As String


如果有4个元素如下:
0 idx(0)=0 Variable(0)="one one one"
1 idx(1)=1 Variable(1)="two two two"
2 idx(2)=2 Variable(1)="three three three"
3 idx(3)=3 Variable(1)="four four four"

现在要访问数组时用这种方式:
取第0号元素 s=Variable(idx(0))
取第1号元素 s=Variable(idx(1))
取第2号元素 s=Variable(idx(2))
取第3号元素 s=Variable(idx(3))

好了,如果要删除第1号元素,就重写 idx() 数组的内容:

for :
idx(0)=0
idx(1)=2
idx(2)=3


取第0号元素 s=Variable(idx(0)), 则s="one"
取第1号元素 s=Variable(idx(1)), 则s="three"
取第2号元素 s=Variable(idx(2)), 则s="four"

用这种方法来虚拟指针,在VB里面效率是很高的,比用指针不会慢多少的!
而比起将后面元素内容复制上来的速度则快很多,(因为不需要复制字符串)
thirdapple 2004-08-21
  • 打赏
  • 举报
回复
Sub Copies()
Dim A(0 To 4) As String, b(0 To 4) As String
Dim i As Long
Dim LngBefore As Long
A(0) = "asefawe"
A(1) = "23fwe"
A(2) = "23saf9"
A(3) = "2w3fwaef"
A(4) = "23r"
LngBefore = 0
For i = 3 To 4
LngBefore = LngBefore + Len(A(i))
Next i
For i = 0 To 1
b(i) = A(i)
Next i
For i = 2 To 3
b(i) = Space(Len(A(i + 1)))
Next i
CopyMemory ByVal StrPtr(b(2)), ByVal StrPtr(A(3)), LngBefore * 2
MsgBox (b(2))
End Sub
boyzhang 2004-08-21
  • 打赏
  • 举报
回复
还是 VirtualAlloc(咩咩(YangVB)) 的方法好,因为我写的是虚拟机,要是变量很多时,

用移动数组的方法就会很慢,用链表又会因为要遍历而很慢,

考虑到以后虚拟机肯定要用到数组,所以不能太慢,还要考虑到能快速处理连续的变量...

而且,只需要考虑变量的删除(也就是模拟垃圾回收),不需要考虑插入

(新变量都是以追加的方式),

所以,采用VirtualAlloc(咩咩(YangVB))的方法应该比较好....
VirtualAlloc 2004-08-21
  • 打赏
  • 举报
回复
这么神?!给个下载地址。。。
boyzhang 2004-08-21
  • 打赏
  • 举报
回复
谢谢大家,结贴了!
thirdapple 2004-08-20
  • 打赏
  • 举报
回复
计算数组中String的Len和,然后拷贝不就可以了
boyzhang 2004-08-20
  • 打赏
  • 举报
回复
楼上的大哥,我知道要用Len来计算长度,

我的意思是不想用多次拷贝,

要像上面的处理整型的方法一样,一次就把内容复制过去

比如:
要删除索引为2的字符串

索引 值
1 "abc"
2 "def"
3 "ghij"
4 "k"
5 "lmnopq"
6 "rs"

传统方法(不想使用这种方法)

用循环逐个拷贝

for i=3 to 6
Copymemory 第I个,第I-1个,Len(第I个)
next i

删除第6个

我的想法是
用CopyMemory把[3,4,5,6]的内容一次性拷贝到[2,3,4,5]

1 "abc"
2 "def" 1 "abc"
3 "ghij" 变为 2 "ghij"
4 "k" 3 "k"
5 "lmnopq" 4 "lmnopq"
6 "rs" 5 "rs"
6 "rs"

然后再删除第6个字符串,

可不知道如何实现,望那位大侠能不吝赐教......


BlueDog()
'---------------------
不好意思,真的惭愧哟,可能是我孤落寡闻,
你说的第二种方法里的Hardcore VB我一点也
没听说过哟!
如果你真的有办法,只要是在我的能力能够
承受的范围以内,出一点钱我还是愿意的.

用VB是可以做虚拟机的,我手头上就有几个
例子,效率也还过得去,不过,还是想自己学习
一下这方面的技术,自己写一个,知其然,还是
应该要知其所以然........
RUKYO 2004-08-20
  • 打赏
  • 举报
回复
VB有指针的吗?
thirdapple 2004-08-20
  • 打赏
  • 举报
回复
用len计算string长度和
boyzhang 2004-08-20
  • 打赏
  • 举报
回复
不好意思!各位,出了两天差,

James0001(虾米—什么时候成大虾?)

你的方法做Long型的可以,做String[变长字符串]又怎么做呢?
likun716 2004-08-19
  • 打赏
  • 举报
回复
study hard
loverpyh 2004-08-19
  • 打赏
  • 举报
回复
upupupupup
SafeF8 2004-08-19
  • 打赏
  • 举报
回复
学习学习
BlueDog 2004-08-19
  • 打赏
  • 举报
回复
事实上你有多种方法来实现

一、采用集合
作为一名VB程序员在手头没有其它比较好的容器情况下用集合是一种简单的方法
增加,列表,移除,取值都很方便,而且它的速度是均匀的。
James0001的方法在数据较少的情况时速度是不会有大区别,但是...

二、采用链表或栈
VB中可不可以实现链表呢,答案是有
A) 采用类对象 一个CNode 一个CLink
用set xxx = new CNode 和 set xxx =nothing 来创建释放一个节点
至于你说的要用按索引方式来枚举,难么?
在你的Clink类中加上一个属性item就可以搞定
这种方法安全,是纯VB,只是有点慢,因为每个对象在VB中是COM对象,
一个空对象也要占用96个字节

B) 当然喜欢Hardcore VB的程序不会放弃,因为大师已经告诉我们使用
CopyMemory, 有了这个短柄斧和varptr这个瑞士军刀,你可以象C程序一样建
立自已的Hardcore VB 链表,速度超快。比C只慢一点点。
至于详细的实现如果你有人民币XXX元的话我可以给你实现:)

三、如果你的VC还不错的话,我建议你用VC写个DLL吧,一个纯C的链表高效而安全
记得要用.DEF文件导出你的函数。

有没有第四种方法呢?
其实我认为如果要速度上的完美及VB的纯味道
你的程序一定要有改进,通过动态数组也可以实现。
动态数组元素变成一个结构,增加一个不使用标志位。
在适当的时候重新整理数组就可以了。

最好采用类来实现。但这种方法我没有实现过,因此速度上和通用性有多大无法给你
正确的建议,当然,你可以自已试试。

很想看看你的虚拟机,呵呵,QQ交流吧 342361949
另外我想小声地问一个问题:虚拟机的语法树结构你用VB如何实现呀
还有词法分析,正则表达式的处理等等
SafeF8 2004-08-18
  • 打赏
  • 举报
回复
zcm123 2004-08-18
  • 打赏
  • 举报
回复
up
supergreenbean 2004-08-18
  • 打赏
  • 举报
回复
先一个数组用以存放数据,然后再用一个数组记录指针如何呢
rainstormmaster 2004-08-18
  • 打赏
  • 举报
回复
你先用CopyMemory试试
加载更多回复(16)

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧