当前位置: 爱符号 - 所有分类 - 资源共享 - 文档 - VB6 - VB6 动态拼接数组(将两个数组连在一起)
VB6 动态拼接数组(将两个数组连在一起) VB6 DongTaiPinJieShuZu(JiangLiangGeShuZuLianZaiYiQi)
符号空间 发表于:2013-07-09 18:36:41 阅读(4573)
关键词:VB6 VB6 visualbasic visualbasic 数组 数组
摘要:要用到的东西: 1.[api]CopyMemory 玩过API的都知道它了吧,用法和说明自己去百度找哦 2.[api]GetTickCount 用来计算时间的 3.ReDim Preserve ReDim 是重定义数据大小,Preserve 保留数组现有数据 4.UBound 方便获取数组的大小,它得到的值始终要加1

既然是将两个数组合为一个,那么就会涉及到大量的数据拷贝,那么效率上来说,还是API最适合,如果是用for循环来做不知道要到猴年马月。


要用到的东西:

1.[api]CopyMemory    玩过API的都知道它了吧,用法和说明自己去百度找哦

2.[api]GetTickCount  用来计算时间的

3.ReDim Preserve     ReDim 是重定义数据大小,Preserve 保留数组现有数据
4.UBound             方便获取数组的大小,它得到的值始终要加1


下面贴出核心代码模块,临时做的测试,就没有取名字了:Module1.bas

Option Explicit
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Public Declare Function GetTickCount Lib "kernel32" () As Long

'求数组的大小
Public Function ArrayLength(argArray) As Long
    On Error GoTo ArrayLength_Error
    ArrayLength = UBound(argArray) + 1
    Exit Function
ArrayLength_Error:
    ArrayLength = 0
End Function

'数组组合(连接在一起)
'argDest     目标数组,它会会变大
'argSource   需要将它合并到argDest
'argIndex    argSource 的起始位置,有的时候并不是一定要从数组的第一个元素开始复制,-1表示从0开始
'argLength   argSource 需要复制多少个元素,有时可能只需要从 argSource 中复制一小段元素,比如 0 to 10 ,可能只需要 4 to 8
Public Sub ArrayCombine(argDest() As Byte, argSource() As Byte, Optional argIndex As Long = -1, Optional argLength As Long = -1)
    'argDest 或 argSource 没有成员,直接退出
    If (ArrayLength(argDest) = 0) Then Exit Sub
    If (ArrayLength(argSource) = 0) Then Exit Sub
    
    'argSource 起始位置
    Dim tIndex As Long: tIndex = 0: If (argIndex > 0) Then tIndex = argIndex
    'argSource 长度
    Dim tLength As Long: tLength = ArrayLength(argSource)
    If (argLength > 0) Then
        tLength = argLength
    Else
        tLength = tLength - tIndex
    End If
    
    Dim tDestIndex As Long: tDestIndex = ArrayLength(argDest)
    
    '调整 argDest 的大小 ,ReDim 是重定义数据大小,Preserve 保留数组现有数据
    ReDim Preserve argDest(tDestIndex + tLength - 1) '数组是 从0开始的,所以要个数-1
    
    '开始复制数据,VarPtr 是为了得到变量的地址,数组的话,可以得到它内部元素的地址
    Call CopyMemory(argDest(tDestIndex), argSource(tIndex), tLength)
End Sub




下面是效果图:


说明:

第一个按钮是直接将两个数组直接合并

代码:


Private Sub Command1_Click()
    '记住不要把数组定死了,否则的话会报错的
    Dim tSource() As Byte
    ReDim tSource(0 To 3)
    tSource(0) = 1
    tSource(1) = 2
    tSource(2) = 3
    tSource(3) = 4
    
    Dim tDest() As Byte
    ReDim tDest(0 To 4)
    tDest(0) = 5
    tDest(1) = 6
    tDest(2) = 7
    tDest(3) = 8
    tDest(4) = 9
    
    Dim tTime As Long: tTime = GetTickCount()
    Call ArrayCombine(tDest, tSource)
    tTime = GetTickCount() - tTime
    
    Debug.Print "合并完成,用时 " & tTime & "毫秒"
    Dim tI As Long
    For tI = LBound(tDest) To UBound(tDest)
        Debug.Print "tDest(" & tI & ")=" & tDest(tI)
    Next
    Debug.Print " "
End Sub


结果:


'合并完成,用时 0毫秒
tDest(0)=5
tDest(1)=6
tDest(2)=7
tDest(3)=8
tDest(4)=9
tDest(5)=1
tDest(6)=2
tDest(7)=3
tDest(8)=4
第二个按钮是从 tSource 中拿取一部分,这个要好好的理解,以后肯定会用得上的,而且会经常用


代码:


Private Sub Command2_Click()
    '记住不要把数组定死了,否则的话会报错的
    Dim tSource() As Byte
    ReDim tSource(0 To 5)
    tSource(0) = 1
    tSource(1) = 2 '1
    tSource(2) = 3 '2
    tSource(3) = 4
    tSource(4) = 5
    tSource(5) = 6
    
    Dim tDest() As Byte
    ReDim tDest(0 To 3)
    tDest(0) = 7
    tDest(1) = 8
    tDest(2) = 9
    tDest(3) = 10
    
    Dim tTime As Long: tTime = GetTickCount()
    Call ArrayCombine(tDest, tSource, 1, 2) '从 索引1开始,只要2位
    tTime = GetTickCount() - tTime
    
    Debug.Print "合并完成,用时 " & tTime & "毫秒"
    Dim tI As Long
    For tI = LBound(tDest) To UBound(tDest)
        Debug.Print "tDest(" & tI & ")=" & tDest(tI)
    Next
    Debug.Print " "
End Sub


结果:


'合并完成,用时 0毫秒
tDest(0)=7
tDest(1)=8
tDest(2)=9
tDest(3)=10
tDest(4)=2
tDest(5)=3






源代码下载:vb-dynamicArrayCombine.zip



目前只实现了 byte类型,注意事项:

1.不要使用变体类型,因为它会临时包装变量,所以会导致CopyMemory失败

2.定义的目标数组切记不要写死大小,否则会导致无法重新定义大小




声明:以上内容仅代表作者观点,不代表爱符号赞成此内容或立场
VB6相关的分享
 
visualbasic相关的分享
 
数组相关的分享
 
作者热播
 
相关分类
热门分享
 
最新分享