ZetCode

FreeBasic Redim 关键字

最后修改日期:2025 年 6 月 16 日

FreeBasic 的 Redim 关键字用于在保留或清除内容的同时调整动态数组的大小。它在处理大小在编译时未知的数组时提供了灵活性。

基本定义

在 FreeBasic 中,Redim 会修改现有动态数组的维度。数组必须首先使用 Dim 或不带维度的 Redim 来声明。

Redim 可以更改数组的下界和上界。可选的 Preserve 关键字在调整大小时会保留现有值。如果没有它,数组内容将被清除。

基本的 Redim 用法

此示例演示了 Redim 创建和调整动态数组大小的最简单用法。

redim_basic.bas
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 关键字在调整大小时会保留现有值。

redim_preserve.bas
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 时指定下界和上界。

redim_bounds.bas
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 也可以与多维数组一起使用。

redim_multidimensional.bas
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 的工作方式类似,但有一些关于字符串内存管理的特殊注意事项。

redim_strings.bas
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 进行调整大小。

redim_udt.bas
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 一起使用,以完全清除并调整数组的大小。

redim_erase.bas
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 重新调整数组的大小。当您需要从头开始使用新大小时,这非常有用。

最佳实践

本教程涵盖了 FreeBasic 的 Redim 关键字,并提供了实际示例,展示了在各种场景下动态数组的调整大小。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 FreeBasic 教程