ReDim
 
定义或调整可变长度数组的大小

语法

声明一个动态数组:
ReDim [ Shared ] symbolname ([subscript [, ...]]) As datatype [, ...]
ReDim [ Shared ] As datatype symbolname ([subscript [, ...]]) [, ...]

调整动态数组的大小:
ReDim [ Preserve ] symbolname ([subscript [, ...]]) [, ...]

参数

Shared
在整个模块中指定对数组的共享(文件范围)访问。
Preserve
当与现有数组一起使用时,数组的内容将在调整大小期间被保留。请注意,在某些情况下Preserve将不会保留原始索引中的数据,请参见下文。
symbolname
一个新的或现有的数组id。
subscript : [ lowerbound To ] upperbound
数组的维度的下限和上限范围。下限默认为零(0 ),或默认Base(如果未指定)。
datatype
数组中包含的元素的类型。

说明

ReDim可用于定义新的可变长度数组,或调整存在的可变长度数组的大小,同时保持相同的维数。ReDim总是生成可变长度的数组,所以与Dim不同,可以使用常量下标来定义可变长度的数组。

定义新的可变长度数组时,其元素是默认构造的。对于简单的数据类型,如IntegerDouble,元素将初始化为零(0 )。对于具有默认构造函数的用户定义类型,将被调用。

注意事项
    • ReDimPreserve在所有情况下可能无法正常工作:
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中的多维数组是按行排列的顺序,而不是列主要顺序。

参考