FreeBasic Redim 关键字
最后修改日期:2025 年 6 月 16 日
FreeBasic 的 Redim 关键字用于在保留或清除内容的同时调整动态数组的大小。它在处理大小在编译时未知的数组时提供了灵活性。
基本定义
在 FreeBasic 中,Redim 会修改现有动态数组的维度。数组必须首先使用 Dim 或不带维度的 Redim 来声明。
Redim 可以更改数组的下界和上界。可选的 Preserve 关键字在调整大小时会保留现有值。如果没有它,数组内容将被清除。
基本的 Redim 用法
此示例演示了 Redim 创建和调整动态数组大小的最简单用法。
Dim arr() As Integer
Redim arr(5) ' Create array with indices 0 to 5
For i As Integer = 0 To 5
arr(i) = i * 10
Next
Redim arr(10) ' Resize to indices 0 to 10
For i As Integer = 0 To 10
Print arr(i),
Next
首先,我们声明一个空动态数组。第一个 Redim 为 6 个元素分配空间。填充后,我们将其调整为 11 个元素。请注意,如果没有 Preserve,原始值将丢失。
带 Preserve 的 Redim
Preserve 关键字在调整大小时会保留现有值。
Dim names() As String
Redim names(2)
names(0) = "Alice"
names(1) = "Bob"
names(2) = "Charlie"
Redim Preserve names(4)
names(3) = "David"
names(4) = "Eve"
For i As Integer = 0 To 4
Print names(i)
Next
这里我们创建一个包含 3 个元素的字符串数组。当使用 Preserve 调整到 5 个元素时,会保留原始名称。只有新元素需要初始化。数组在保留数据的情况下增长。
带自定义边界的 Redim
FreeBasic 允许在 Redim 时指定下界和上界。
Dim temperatures() As Single
Redim temperatures(1 To 3)
temperatures(1) = 22.5
temperatures(2) = 23.1
temperatures(3) = 21.8
Redim Preserve temperatures(1 To 5)
For i As Integer = 1 To 5
Print "Day "; i; ": "; temperatures(i)
Next
此示例创建了一个索引从 1 开始而不是 0 开始的数组。第一个 Redim 创建了一个 3 元素的数组,然后我们将其扩展到 5 个元素,同时保留现有值。在某些情况下,自定义边界可以使代码更直观。
带多维数组的 Redim
Redim 也可以与多维数组一起使用。
Dim matrix(,) As Integer
Redim matrix(2, 2) ' 3x3 matrix
For i As Integer = 0 To 2
For j As Integer = 0 To 2
matrix(i, j) = i * 3 + j
Next
Next
Redim Preserve matrix(2, 4) ' 3x5 matrix
For i As Integer = 0 To 2
For j As Integer = 0 To 4
Print matrix(i, j),
Next
Print
Next
我们创建一个 3x3 的矩阵,填充值,然后调整为 3x5。请注意,对于多维数组,在使用 Preserve 时只能更改最后一个维度。其他维度必须保持不变。
带字符串数组的 Redim
字符串数组与 Redim 的工作方式类似,但有一些关于字符串内存管理的特殊注意事项。
Dim lines() As String
Dim count As Integer = 0
' Simulate reading lines from a file
While count < 5
Redim Preserve lines(count)
lines(count) = "Line " & (count + 1)
count += 1
Wend
For i As Integer = 0 To UBound(lines)
Print lines(i)
Next
此示例展示了如何逐步构建字符串数组。每次迭代都会向数组添加一个元素。Preserve 会保留现有字符串。字符串数组对于文件读取或用户输入等动态内容特别有用。
带用户定义类型的 Redim
用户定义类型的数组也可以使用 Redim 进行调整大小。
Type Person
name As String
age As Integer
End Type
Dim people() As Person
Redim people(2)
people(0).name = "Alice" : people(0).age = 25
people(1).name = "Bob" : people(1).age = 30
people(2).name = "Charlie" : people(2).age = 28
Redim Preserve people(4)
people(3).name = "David" : people(3).age = 35
people(4).name = "Eve" : people(4).age = 27
For i As Integer = 0 To UBound(people)
Print people(i).name, people(i).age
Next
在这里,我们创建了一个自定义 Person 类型数组。在初始化 3 个元素后,我们将其扩展到 5 个,同时保留现有数据。每个元素都是一个包含姓名和年龄字段的结构。Preserve 对 UDT 的作用与对简单类型的作用相同。
带 Erase 的 Redim
Erase 语句可以与 Redim 一起使用,以完全清除并调整数组的大小。
Dim values() As Double
Redim values(4)
For i As Integer = 0 To 4
values(i) = Rnd() * 100
Next
Erase values ' Deallocates the array
Redim values(9) ' Create new array
For i As Integer = 0 To 9
values(i) = Rnd() * 100
Next
For i As Integer = 0 To 9
Print values(i),
Next
此示例展示了 Erase 如何完全清除数组并释放其内存。在 Erase 之后,必须在使用前使用 Redim 重新调整数组的大小。当您需要从头开始使用新大小时,这非常有用。
最佳实践
- 初始化:在使用不带 Preserve 的 Redim 后,请务必初始化数组元素。
- 边界检查:使用 UBound/LBound 避免越界错误。
- 性能:在循环中尽可能减少 Redim Preserve 操作。
- 内存:完成后使用 Erase 清理大型数组以释放内存。
- 维度:请记住,在使用多维 Preserve 时只能更改最后一个维度。
本教程涵盖了 FreeBasic 的 Redim 关键字,并提供了实际示例,展示了在各种场景下动态数组的调整大小。