定义或调整可变长度数组的大小
语法
声明一个动态数组:
调整动态数组的大小:
ReDim [ Preserve ] symbolname ([subscript [, ...]]) [, ...]
参数
Shared
在整个模块中指定对数组的共享(文件范围)访问。
Preserve
当与现有数组一起使用时,数组的内容将在调整大小期间被保留。请注意,在某些情况下
Preserve将不会保留原始索引中的数据,请参见下文。
symbolname
一个新的或现有的数组id。
subscript : [
lowerbound To ]
upperbound
数组的维度的下限和上限范围。下限默认为零(
0 ),或默认
Base(如果未指定)。
datatype
数组中包含的元素的类型。
说明
ReDim可用于定义新的可变长度数组,或调整存在的可变长度数组的大小,同时保持相同的维数。
ReDim总是生成可变长度的数组,所以与
Dim不同,可以使用常量下标来定义可变长度的数组。
定义新的可变长度数组时,其元素是默认构造的。对于简单的数据类型,如
Integer或
Double,元素将初始化为零(
0 )。对于具有默认构造函数的用户定义类型,将被调用。
注意事项:
Preserve的当前行为是将原始数据保持在内存中,并仅扩展或缩小内存大小。
其行为(具有单个维度)仅在上限更改时才被明确定义。如果下限发生变化,当前的结果就是数据实际上被转移到新的下限开始。
对于多个维度,只有第一维度的上限才能安全地增加。如果第一维度减小,则现有的可映射数据可能会丢失。如果下位尺寸根本调整大小,则可能难以预测效果。
- ReDim不能在固定大小的阵列上使用 - 即使用Dim制成的具有不变界限的数组。这包括UDT中包含的固定大小的数组(用户定义的Types))。这也包括作为函数中的参数传递的固定长度的数组。FreeBASIC无法阻止您在编译时尝试此操作,但在运行时的结果将不会被定义。
- 在包含对象类的实例的数组的成员过程中使用ReDim未定义,并且[hopefully]将导致可怕的崩溃。
- 为了使用ReDim(调整大小)与复杂表达式(特别是如果数组表达式本身包含括号),数组表达式必须括在括号中以解决解析模糊。
例子
''定义具有5个元素的可变长度数组
''
ReDim array(0 To 4) As Integer
For index As Integer = LBound(array) To UBound(array)
array(index) = index
Next
''调整具有10个元素的可变长度数组的大小
''(下限应保持不变)
ReDim Preserve array(0 To 9) As Integer
Print “指数”, “值”
For index As Integer = LBound(array) To UBound(array)
Print index, array(index)
Next
该程序将产生以下输出:
指数值0 0 1 1 2 2 3 3 4 4 5 0 6 0 7 0 8 0 9 0
''定义可变长度的数组
Dim array() As Integer
''ReDim数组有3 * 4个元素
ReDim array(1 To 3, 1 To 4)
Dim As Integer n = 1, i, j
Print "3 * 4:"
Print
For i = LBound(array, 1) To UBound(array, 1)
For j = LBound(array, 2) To UBound(array, 2)
array(i, j) = n
Print Using "## "; array(i, j);
n += 1
Next
Print
Next
Print
''ReDim保留数组具有4 * 4个元素,保留内容
''(只有第一个上限应该改变)
ReDim Preserve array(1 To 4, 1 To 4) As Integer
Print "4 * 4:"
Print
For i = LBound(array, 1) To UBound(array, 1)
For j = LBound(array, 2) To UBound(array, 2)
Print Using "## "; array(i, j);
Next
Print
Next
Print
''ReDim保存数组具有2 * 4个元素,保存但转换内容
''(只有第一个上限应该改变)
ReDim Preserve array(1 To 2, 1 To 4) As Integer
Print "2 * 4:"
Print
For i = LBound(array, 1) To UBound(array, 1)
For j = LBound(array, 2) To UBound(array, 2)
Print Using "## "; array(i, j);
Next
Print
Next
Print
该程序将产生以下输出:
3 * 4:
1 2 3 4
5 6 7 8
9 10 11 12
4 * 4:
1 2 3 4
5 6 7 8
9 10 11 12
0 0 0 0
2 * 4:
1 2 3 4
5 6 7 8
与QB差别
- Preserve在Visual Basic中,但不在QBASIC中。
- FreeBASIC中的多维数组是按行排列的顺序,而不是列主要顺序。
参考