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
关键字,并提供了实际示例,展示了在各种场景下动态数组的调整大小。