ZetCode

FreeBasic Any 关键字

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

FreeBasic 的 Any 关键字有两个主要用途:作为 Any Ptr 用于通用指针类型,它可以接受指向任何数据类型的指针;以及在数组声明中指示未初始化的数组。

基本定义

在 FreeBasic 中,Any Ptr 是一种可以指向任何数据类型的指针类型,这在处理需要接受不同指针类型的函数时提供了灵活性。Any 关键字也用于数组声明,以指定数组应保持未初始化状态。

Any 关键字对于创建与不同数据类型的指针一起工作的通用函数,以及声明不应自动初始化为零的数组非常有用。

Any Ptr 基本用法

此示例展示了如何使用 Any Ptr 创建一个可以指向不同数据类型的通用指针。

any_basic.bas
Dim As Integer value1 = 42
Dim As Double value2 = 3.14159
Dim As String value3 = "Hello"

Dim p As Any Ptr

p = @value1
Print "Integer value: "; *Cast(Integer Ptr, p)

p = @value2
Print "Double value: "; *Cast(Double Ptr, p)

p = @value3
Print "String value: "; *Cast(String Ptr, p)

这里我们声明一个 Any Ptr 变量,它可以指向不同的数据类型。我们将整数、双精度浮点数和字符串变量的地址分配给同一个指针,然后使用 Cast 通过适当的指针类型访问值。

Any 与数组

Any 关键字与数组一起使用,表示它们不应被自动初始化为零。

any_array.bas
Dim As Integer a(0 To 9) = Any  '' uninitialized array
Dim As Double d(0 To 4)         '' initialized to zero

Print "Uninitialized array values:"
For i As Integer = 0 To 9
    Print "a("; i; ") = "; a(i)
Next

Print "Initialized array values:"
For i As Integer = 0 To 4
    Print "d("; i; ") = "; d(i)
Next

此示例显示了已初始化和未初始化数组之间的区别。使用 = Any 声明的数组包含不可预测的值,而常规数组会自动初始化为零。

函数参数中的 Any Ptr

函数可以接受 Any Ptr 参数来处理指向不同数据类型的指针。

any_function.bas
Declare Sub PrintBytes(ByVal x As Any Ptr)

Dim As Integer num = 1234
Dim As Double dbl = 3.14159
Dim As String text = "Hello"

PrintBytes(@num)
PrintBytes(@dbl)
PrintBytes(@text)

Sub PrintBytes(ByVal x As Any Ptr)
    Dim As Integer i
    Print "Raw bytes: ";
    For i = 0 To 7  '' Print first 8 bytes
        Print Cast(UByte Ptr, x)[i] & " ";
    Next
    Print
End Sub

PrintBytes 子程序接受一个 Any Ptr 参数,使其能够处理指向不同数据类型的指针。它将数据解释为原始字节,演示了 Any Ptr 如何提供低级访问。

带有 Any Ptr 的完整示例

这个全面的示例演示了 Any 关键字的两种用法:未初始化数组和通用指针参数。

any_complete.bas
Declare Sub echo(ByVal x As Any Ptr)

Dim As Integer a(0 To 9) = Any '' uninitialized array
Dim As Double  d(0 To 4)       '' initialized to zero

Dim p As Any Ptr

Dim pa As Integer Ptr = @a(0)
Print "Not initialized ";
echo pa       '' pass to echo a pointer to integer

Dim pd As Double Ptr = @d(0)
Print "Initialized ";
echo pd       '' pass to echo a pointer to double

p = pa     '' assign to p a pointer to integer
p = pd     '' assign to p a pointer to double

Sleep

Sub echo (ByVal x As Any Ptr)
    Dim As Integer i
    For i = 0 To 39
        'echo interprets the data in the pointer as bytes
        Print Cast(UByte Ptr, x)[i] & " ";
    Next
    Print
End Sub

此示例展示了 Any 在 FreeBasic 中的实际用途。echo 子程序接受任何指针类型并将数据解释为原始字节。数组演示了已初始化和未初始化内存分配之间的区别。

Any 初始化语法

Any 关键字还用于指示变量或数组不应被初始化,出于性能原因,其内容将是不可预测的。

any_init.bas
Dim As Integer uninit = Any       '' not initialized
Dim As Integer init = 0           '' initialized to 0

Dim As Integer uninit_array(0 To 4) = Any  '' not initialized
Dim As Integer init_array(0 To 4)          '' initialized to 0

Print "Uninitialized variable: "; uninit
Print "Initialized variable: "; init

Print "Uninitialized array values:"
For i As Integer = 0 To 4
    Print "uninit_array["; i; "] = "; uninit_array(i)
Next

Print "Initialized array values:"
For i As Integer = 0 To 4
    Print "init_array["; i; "] = "; init_array(i)
Next

此示例演示了使用 Any 防止自动初始化。未初始化的变量和数组包含内存中先前存在的任何数据,当您计划立即赋值时,这可能对性能很有用。

本教程涵盖了 FreeBasic 的 Any 关键字,并提供了实际示例,展示了其在需要指针灵活性和未初始化内存分配的不同场景中的用法。

作者

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

列出所有 FreeBasic 教程