为何VBScript中无Preserve可重定义多维数组,加Preserve却失败?
为什么VBScript中多维数组用ReDim Preserve会失败?
这事儿其实是VBScript的硬性设计限制——当你用Preserve关键字想保留数组原有数据时,只能修改多维数组的最后一维的大小,其他维度动都不能动。而一维数组本身就只有一维,所以用Preserve完全没问题;要是不带Preserve,VBScript会直接扔掉旧数组,重新建个新的,不管你改哪个维度,自然不会报错,但旧数据也就没了。
看你的代码问题出在哪
你报错的那行代码是:
ReDim Preserve marray(UBound(marray)+2, 3)
这里你修改的是数组的第一维(从原来的上限2改成了4),刚好踩中了VBScript的限制,所以直接抛出Subscript out of range的错误。
正确的Preserve用法(只改最后一维)
如果你的数组是marray(2,3),要是想保留数据改大小,只能动最后一维,比如:
' 只扩展最后一维,第一维不动 ReDim Preserve marray(2, 5)
这样就能正常保留原有数据,同时扩展最后一维的长度。
要是必须改非最后一维还想保数据怎么办?
那就得手动做数据迁移了,步骤很简单:
- 先创建一个符合你需求的新数组
- 循环遍历原数组,把每个元素挨个复制到新数组对应位置
- 把新数组赋值给原数组变量
给你改一下你的代码,实现你想要的扩展第一维且保留数据的效果:
Dim marray() ReDim marray(2,3) WScript.Echo "marray ubound = " & UBound(marray) marray(0, 0) = "item 0,0" marray(0, 1) = "item 0,1" marray(0, 2) = "item 0,2" marray(0, 3) = "item 0,3" marray(1, 0) = "item 1,0" marray(1, 1) = "item 1,1" marray(1, 2) = "item 1,2" marray(1, 3) = "item 1,3" marray(2, 0) = "item 2,0" marray(2, 1) = "item 2,1" marray(2, 2) = "item 2,2" marray(2, 3) = "item 2,3" ' 输出原数组内容 For Each item In marray WScript.Echo item Next ' 手动迁移数据到新数组 Dim newMarray() Dim oldFirstDim, oldSecondDim, newFirstDim oldFirstDim = UBound(marray, 1) ' 原数组第一维的上限 oldSecondDim = UBound(marray, 2) ' 原数组第二维的上限 newFirstDim = oldFirstDim + 2 ' 要扩展后的第一维上限 ' 创建新数组 ReDim newMarray(newFirstDim, oldSecondDim) ' 循环复制每个元素 Dim i, j For i = 0 To oldFirstDim For j = 0 To oldSecondDim newMarray(i, j) = marray(i, j) Next Next ' 替换原数组 marray = newMarray WScript.Echo "New marray ubound = " & UBound(marray) ' 添加新元素 marray(3, 0) = "item 3,0" marray(3, 1) = "item 3,1" marray(3, 2) = "item 3,2" marray(3, 3) = "item 3,3" marray(4, 0) = "item 4,0" marray(4, 1) = "item 4,1" marray(4, 2) = "item 4,2" marray(4, 3) = "item 4,3" ' 输出新数组内容 For Each item In marray WScript.Echo item Next
最后再划个重点
- 不带
Preserve的ReDim:会销毁原数组,创建全新数组,任意维度都能改,但原有数据会被清空 - 带
Preserve的ReDim:只能修改多维数组的最后一维,改其他维度直接报错,但能保留原有数据 - 要改非最后一维且保数据:只能手动复制迁移数据,没有捷径
内容的提问来源于stack exchange,提问作者Adriano_Pinaffo
相关产品推荐
相关产品推荐

