比如,我现在有一个类型:Public Type MyType
    Num1 as Long
    Num2 as LOng
    Str1 as String
    Str2 as string
End Type然后定义一个动态数组:Dim MyData() as MyType设此数组中已经有10个成员了,索引为0的成员不使用.那么,如何得到它的地址?以及这个动态数组在内存中占用的长度?我的目的是,想从一个类中把此数组直接复制到另一个同类型动态数组里,而不用循环.因为数组非常大,一般是3万左右,循环非常非常的慢,有时还要溢出.所以想到了直接复制内存,就是CopyMemory,可是老用不好.求助了!!

解决方案 »

  1.   

    Private Type MyType
        Num1 As Long
        Num2 As Long
        Str1 As String
        Str2 As String
    End TypePrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Private MyData() As MyType
    Private MyData2(30000) As MyTypePrivate Sub Form_Load()
        ReDim MyData(30000)
        
        MyData(1).Num1 = 2
        MyData(30000).Str2 = "hello"
            
        
        CopyMemory ByVal VarPtr(MyData2(0)), ByVal VarPtr(MyData(0)), LenB(MyData(0)) * 30001&
    End SubPrivate Sub Command1_Click()
        Debug.Print MyData2(30000).Str2
    End Sub数字部分复制问题不大,但是你要注意在结构体里面的String类型只是一个指针,如果使用不好可能会引起程序崩溃
      

  2.   

    这个不怎么好判断,Str1 As String
        Str2 As String
    都不是固定长度,因为他们是可以变动的,所以MyData(0)的长度也许和MyData(1) 不相等
      

  3.   

    我说了,结构体中的饿Str1,Str2都只是4字节的字符串指针,不用管其具体长度如何
      

  4.   

    每个结构体的大小都是16字节 4字节Long + 4字节Long + 4字节字符串地址 + 4字节字符串地址=16字节
      

  5.   

    Public Type MyType
        Num1 as Long
        Num2 as LOng
        Str1 as String
        Str2 as string
    End Type中num1和num2各占4个字节,str1和str2定义为string,由于不是定长字符串,所以实际上都只是4字节的字符串指针,而对于定长字符串,情况就变得不一样了,结构体的长度开始和字串有关
      

  6.   

    谢谢楼上各位的讲解!!那么,由于"str1和str2定义为string,由于不是定长字符串,所以实际上都只是4字节的字符串指针",我是否可以把它们定义为一个LONG类型,而专门放指针,并用一个过程来处理当中的转换?因为是同一类型,所以此过程可以通用的.//要两个一样的数组做啥?直接引用原始数组不可以吗?因为要对复制后的数组进行操作,所以不能直接引用原数组.另外,由于是多个类中的内部数组,如果直接公开,对程序结构有影响.....从以上帖子来看,这种包含变长字符串类型的自定义类型数组就没办法用CopyMemory处理了吗?
      

  7.   

    如果专门用指针的话你处理起来依然会十分麻烦,用copymemory也不是不可以,但是要保证副本和原本的生命期
      

  8.   

    //那么,由于"str1和str2定义为string,由于不是定长字符串,所以实际上都只是4字节的字符串指针",我是否可以把它们定义为一个LONG类型,而专门放指针,并用一个过程来处理当中的转换?当然可以,不过看起来没这个必要
      

  9.   

    那么,有什么简单的方法能实现这种自定义类型动态数组的复制呢?比如,Set A()=B()???这样好象不行的.
      

  10.   

    ^_^b.....这是偶的荣幸啦.......不过听楼上朋友这么说,是有好的解决办法?洗耳恭听ing.......
      

  11.   

    这个问题是不是想复杂了?结构中变长串的难处理,只存在于VB与API之间,VB内部对结构处理是很方便的,看看下面的代码:
    Private Type MyType
        Num1 As Long
        Num2 As Long
        Str1 As String
        Str2 As String
    End Type
    Dim a(30000) As MyType
    Private Sub Command1_Click()
        Dim b() As MyType
        a(23).Str1 = "dfgfdhjgfjhgk"
        b = a
        a(23).Str1 = ""
        Debug.Print b(23).Str1
    End Sub
    这是真正的数据复制,而不是指针复制。
      

  12.   

    也许不这么简单,仅从老大的代码里看 此类型是个私有类型。
    (搞不懂:为什么只有rainstormmaster(暴风雨 v2.0) 正确定义了类型作用域)如果想在另一个类模块里进行数据复制,那实际上,偶就是想问这个问题:跨模块的私有类型的数据复制!!!
      

  13.   

    另外,就homezj(小吉)的代码来看,仅适合VB6而VB5是不支持数组直接赋值的
    (但我相信VB5应该做得到,大不了就是指针地址之间的问题嘛)所以,也想问下,VB5下如何具体实现?
      

  14.   

    呵呵,从我两年前在这里见到楼上朋友的时候,到现在,你都一直使用VB5.为什么呢?它有什么好处吗?话说回来.我想使用一个过程,把A数组中的可复制数据复制到B数组,再把A数组变长字符串指针所指实际内容的地址得到,并复制,再把指针返回B数组不过,如果A数组指针所指内容并不连续,好象就...............希望各位看看这个问题,如何才好解决呢?
      

  15.   

    为什么不用Friend呢?专门处理你的这个要求的!
      

  16.   

    友元变量好象也是访问同一对象的吧?它与Public差别不大.希望大家看看,有没有什么可行的办法来解决此问题.当然,简单最好了.如果很复杂,也没关系,当作学习!!!!
      

  17.   

    跨模块的私有类型的数据复制就是要用友元变量,它它与Public差别在于同类之间2者相同,一旦封装为DLL,则变成PRIVATE,便于掩藏接口.
      

  18.   

    期待"ok999ok(ok999ok) ( ) 信誉:100 "朋友及其它朋友的高见~~~~现在我还是用循环来复制的,一次要好几秒中间再用Doevents防止程序挂起.但这样好象不太好.要是直接能复制内存就好了........-_-b
      

  19.   

    类1里,添加一个私有动态数组,声明为自定义类型.private type mytype
        str1 as string
        str2 as string
        num1 as long
        num2 as long
    end typedim pridata() as mytype类2声明为类1的新实例.现在需要把类2里的pridata()赋值为类1里同样的内容,并由用户使用(目的:用户编辑数组内容时,不影响原始内容.当用户确认更新后,再次把类2的pridata()赋值给类1的pridata().)目前使用的是循环赋值法,一次赋值需要十多秒左右(数组成员一般有三万)试过多种方法,无法直接赋值.现在向大家求一种快速赋值的方法.之前试过使用指针,但由于自定义类型中有变长字符,其值在内存中其实是一指针,真正的字符串内容并不在LEN(pridata())中.如有哪里还未说明白,请再作说明.我自己现在还在试着找找变长字符串的实际地址,如果它是一个连续的地址,就把这个地址复制一份,并把指针写入新的数组内.可是,如果此地址也不是连续的,就没有什么办法了.请各位朋友出高招解决一下这个问题!!
      

  20.   

    rem 用Friend Property()
    rem 这个能满足你的要求吗?rem 窗体 Form1
    Option Explicit
    Dim a(1 To 1000000)
    Private Sub Form_Load()
        Dim i As Long
        For i = 1 To 1000000
            a(i) = i
        Next
    End Sub
    Private Sub Command1_Click()
        Dim objA As New Class1
        Dim objB As New Class1
        objA.SetDemoParts 100, a
        objB.Demo = objA.Demo '呵呵,百万数据也一下子复制了
        MsgBox objA.Value
        objA.ShowDemo (1)
    End Subrem  标准模块里:Module1.bas
    Public Type udtDemo
        Value As Variant
        V() As Variant
    End Typerem 类Class1.bas
    Private mDemo As udtDemoFriend Property Get Demo() As udtDemo
        Demo = mDemo
    End Property
    Friend Property Let Demo(NewDemo As udtDemo)
        mDemo = NewDemo
    End PropertyPublic Sub SetDemoParts(ByVal V As Variant, aV() As Variant)
        mDemo.Value = V
        mDemo.V = aV
    End SubPublic Sub ShowDemo(lng As Long)
        MsgBox mDemo.V(lng)
    End SubPublic Property Get Value() As Variant
       Value = mDemo.Value
    End Property
    Public Property Let Value(V As Variant)
       mDemo.Value = V
    End Property