首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VB TXT 定义n个一维数组的有关问题?多谢

2012-08-14 
VB TXT 定义n个一维数组的问题?请指教,谢谢!有n列数据需要存入N个一维数组,比如A1列、A2列、......An列,需要

VB TXT 定义n个一维数组的问题?请指教,谢谢!
有n列数据需要存入N个一维数组,比如A1列、A2列、......An列,需要存入A1() A2() A3()....An()数组中。

问题是,N不定,可能会有变,而定义一维数组时,数组名中有不能含有变量,导致定义使用这些数组时很不方便,比如,当N为3时,我需要定义 Dim A1(),A2(),A3() AS String ,而无法这样定义Dim An() As String n=1,2,3,而且程序当中使用这些数组时也很不方便,无法根据变量n直接定位到数组An()上,根源就是定义的一维数组名中不能含有变量。

  本来想用二维数组来实现动态的列数,由于行数巨大,担心使用二维数组会内存溢出,只能考虑使用n个一维数组的。同时,如果使用了 Preserve 关键字,就只能调整数组最后维的大小,并且不能改变数组的维数。即只能变化列,而无法变化行了。

请高手指教,有啥好办法或者如何变通一下,实现 “一维数组名字 中含变量”的功能,或者使用二维数组,可以实现行数动态变化的功能,即可以用ReDim Preserve (m,n)。

[解决办法]
你这个问题其实就是对内存的动态分配问题。建议你调用API来实现:
1.用HeapCreate为进程创建一个堆,返回一个堆句柄
2.用HeapAlloc从指定堆上分配内存块,这里分配的内存块是连续的,实际上就是一个1维数组
3.当你想要调整已分配的内存块的大小时,调用HeapReAlloc重新分配内存,改变已经分配好的堆内存块大小
4.程序结束后调用HeapFree释放HeapAlloc和HeapReAlloc所分配的内存

在第2步时,你每调用一次HeapAlloc就分配一个内存块,也就是为你分配了一个一维数组。这个函数的返回值就是指向这个一维数组的指针。你可以把这些指针存放在另一个指针数组里,这个指针数组也是由HeapAlloc分配的。这样一来,指针数组的大小可用HeapReAlloc重新分配,也就是可以改变数组的列数;另外其余每个数组的大小同样可由HeapReAlloc重新分配,即改变了每个一维数组的维数。


[解决办法]
可以用类(Class1)包装一个一维数组,这个数组是一个动态数组,类提供重新定义这个动态数组的接口以及方位/修改数组元素的方法.这样形成了行坐标
然后再定义一个Class1的动态数组.这样形成列坐标.

当然方位的时候不会是象方位二维数组那样用(行坐标,列坐标)的方式方位,不过要是觉得麻烦可以再次包装.

VB code
'类模块Class1Option ExplicitDim a() As StringPublic Sub mDim(n As Long, Optional Pre As Boolean = False)If Pre Then        ReDim Preserve a(n)Else        ReDim a(n)End IfEnd SubPublic Function GetData(n As Long) As StringGetData = a(n)End FunctionPublic Sub LetData(n As Long, ByVal vNewValue As String)a(n) = vNewValueEnd Sub'窗体模块Option ExplicitDim b() As Class1Private Sub Command1_Click()Dim a1 As New Class1a1.mDim (9)ReDim Preserve b(UBound(b))Set b(UBound(b) + 1) = a1Debug.Print b(0).GetData(0)Call b(0).LetData(0, "1")End SubPrivate Sub Form_Load()ReDim b(0)End Sub 

热点排行