比如,我现在有一个类型: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,可是老用不好.求助了!!
Num1 as Long
Num2 as LOng
Str1 as String
Str2 as string
End Type然后定义一个动态数组:Dim MyData() as MyType设此数组中已经有10个成员了,索引为0的成员不使用.那么,如何得到它的地址?以及这个动态数组在内存中占用的长度?我的目的是,想从一个类中把此数组直接复制到另一个同类型动态数组里,而不用循环.因为数组非常大,一般是3万左右,循环非常非常的慢,有时还要溢出.所以想到了直接复制内存,就是CopyMemory,可是老用不好.求助了!!
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类型只是一个指针,如果使用不好可能会引起程序崩溃
Str2 As String
都不是固定长度,因为他们是可以变动的,所以MyData(0)的长度也许和MyData(1) 不相等
Num1 as Long
Num2 as LOng
Str1 as String
Str2 as string
End Type中num1和num2各占4个字节,str1和str2定义为string,由于不是定长字符串,所以实际上都只是4字节的字符串指针,而对于定长字符串,情况就变得不一样了,结构体的长度开始和字串有关
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
这是真正的数据复制,而不是指针复制。
(搞不懂:为什么只有rainstormmaster(暴风雨 v2.0) 正确定义了类型作用域)如果想在另一个类模块里进行数据复制,那实际上,偶就是想问这个问题:跨模块的私有类型的数据复制!!!
(但我相信VB5应该做得到,大不了就是指针地址之间的问题嘛)所以,也想问下,VB5下如何具体实现?
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())中.如有哪里还未说明白,请再作说明.我自己现在还在试着找找变长字符串的实际地址,如果它是一个连续的地址,就把这个地址复制一份,并把指针写入新的数组内.可是,如果此地址也不是连续的,就没有什么办法了.请各位朋友出高招解决一下这个问题!!
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