Redim Preserve 重定义多维数组怎么不好用??

ufo_ufo 2002-11-26 11:26:55
比如:

redim a(0,0)

redim preserve a(1,1) -------- 出错!

什么原因?

但是一维数组这样却正常。
...全文
1199 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
戚爱斌 2002-11-26
  • 打赏
  • 举报
回复
up

Sean918 2002-11-26
  • 打赏
  • 举报
回复
是你用错了关键字 preserve ,如果不用preserve ,就是说不保存原来的数组内容,那你的写法是可以的

redim a(0,0)

redim a(1,1)
Sean918 2002-11-26
  • 打赏
  • 举报
回复
楼主仔细看看这句:“Preserve
可选。关键字,当仅更改《最后一个维度》的大小时,用来保留现有数组中的数据。


“最后一个维度”,就是说,你这样写才对:
redim a(0,0)

redim preserve a(0,1)
ufo_ufo 2002-11-26
  • 打赏
  • 举报
回复
kao,大家都试过没有? 净拷贝些东西来
Sean918 2002-11-26
  • 打赏
  • 举报
回复
Visual Basic 语言参考

ReDim 语句请参见
Const 语句 | Dim 语句 | Erase 语句
在过程级用于重新分配数组变量的存储空间。

ReDim [ Preserve ] name[(boundlist)]
各部分说明
Preserve
可选。关键字,当仅更改最后一个维度的大小时,用来保留现有数组中的数据。
name
必选。变量名称。必须是有效的 Visual Basic 标识符。可以重新设置同一语句中任意多个变量的维度,指定每个变量的 name 和 boundlist 部分。以逗号分隔多个变量。
boundlist
必选。非负的整数列表,表示重定义数组维度的上限。以逗号分隔多个上限。boundlist 中维度的数量必须与数组的原始秩匹配。
在 boundlist 中的每个值都指定维度的上限,而不是长度。下限总是为零,因此每个维度的下标在 0 到上限之间变化。

可以使用 -1 来声明数组维数的上限。这表示数组为空但不是 Nothing,某些公共语言运行库函数需要进行这种区分。然而,Visual Basic 代码不能成功访问此类数组。如果试图这样做,则在执行期间会发生 IndexOutOfRangeException 错误。

备注
ReDim 语句仅可以在过程级出现。这意味着可以在过程中而不是在类或模块级重新定义数组。

ReDim 语句用来更改已被正式声明的数组的一个或多个维度的大小。ReDim 无法更改该数组的秩(维度数目)。

ReDim 语句无法更改数组变量的数据类型,或无法提供数组元素的新初始化值。

ReDim 释放现有数组并且创建具有相同秩的新数组。除非指定 Preserve,否则新数组的元素初始化成它们的数据类型的默认值。

如果包含 Preserve 关键字,Visual Basic 将这些元素从现有数组复制到新数组。使用 Preserve 时,只可以重新调整数组的最后维度的大小,对于其他每个维,必须指定它在现有数组中已经具有的相同大小。

例如,如果数组只有一维,可以重新调整该维度并依然保留该数组的内容,因为它是最后的和唯一的维度。然而,如果数组具有两个或多个维度,则如果使用 Preserve 将仅可以更改最后维度的大小。

下面的示例增加一个动态数组的最后维度的大小,却没有丢失数组中的任何现有数据,然后减小该大小,有部分数据丢失:

Dim IntArray(10, 10, 10) As Integer
' ...
ReDim Preserve IntArray(10, 10, 20)
' ...
ReDim Preserve IntArray(10, 10, 15)
第一个 ReDim 创建新数组,从现有数组中复制所有元素。它还向每一层的每一行的结尾另外添加 10 列。这些新列中的元素被初始化成该数组的元素类型的默认值。

第二个 ReDim 创建另一个新数组,复制所有适合的元素。然而,每一层的每一行的结尾丢失了 5 列。如果不再使用这些栏,丢失将不成问题。减小大型数组的大小能够释放不再需要的内存。

可以在持有数组值的属性上使用 ReDim。

示例
该示例使用 ReDim 语句分配和重新分配数组变量的存储空间。

Dim I, MyArray() As Integer ' Declare variable and array variable.
ReDim MyArray(5) ' Allocate 6 elements.
For I = 0 To UBound(MyArray)
MyArray(I) = I ' Initialize array.
Next I
下一个语句重新调整该数组的大小,而不保存该元素的内容。

ReDim MyArray(10) ' Resize to 11 elements.
For I = 0 To UBound(MyArray)
MyArray(I) = I ' Initialize array.
Next I
下面的语句重新调该整数组的大小,且保存该元素的内容。

ReDim Preserve MyArray(15) ' Resize to 16 elements.
ufo_ufo 2002-11-26
  • 打赏
  • 举报
回复
MSDN 上的东西我也知道, 根本就不好用!
holydiablo 2002-11-26
  • 打赏
  • 举报
回复
ReDim 语句 语言参考
--------------------------------------------------------------------------------

描述
用于过程级声明动态数组变量并分配或重新分配存储空间。
语法
ReDim [Preserve] varname(subscripts) [, varname(subscripts)] . . .
ReDim 语句语法有以下部分:

部分 描述
Preserve 当更改现有数组最后一维的大小时保留数据。
varname 变量名,遵循标准变量命名约定。
subscripts 数组变量的维数,最多可以声明 60 维数组。subscripts 参数语法格式如下:
upper [,upper] . . .

数组的下界总是零。



说明
ReDim 语句通常用于指定或修改动态数组的大小,这些数组已用带有空括号的 Private、Public 或 Dim 语句(没有维数下标)正式声明过。可以重复使用 ReDim 语句更改数组维数和元素数目。
如果使用了 Preserve 关键字,就只能调整数组最后维的大小,并且不能改变数组的维数。例如,如果数组只有一维,就可以修改该数组的大小,因为该维是最后的也是仅有的一维。但是,如果数组有两个或更多维,就只能改变末维的大小并保留数组内容。下面的样例示范了如何不删除动态数组的原有内容而又增加末维的大小。


ReDim X(10, 10, 10)
. . .
ReDim Preserve X(10, 10, 15)


--------------------------------------------------------------------------------

小心 如果减小数组的大小,则将丢失被排除的元素中的数据。

--------------------------------------------------------------------------------

变量初始化时,数值变量初始化为 0,字符串变量初始化为零长度字符串 ("")。在使用引用对象的变量前,必须使用 Set 语句将某个现有对象赋予该变量。在进行对象赋值以前,已声明的对象变量有特定值 Nothing。
--------------------------------------------------------------------------------

7,763

社区成员

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

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