ZetCode

FreeBasic Sub 关键字

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

FreeBasic 的 Sub 关键字定义了一个子例程,它是一段执行特定任务的代码块。子例程有助于将代码组织成可重用的单元并改进程序结构。

基本定义

在 FreeBasic 中,Sub 声明了一个不返回值的过程。子例程可以接受参数,并可以在程序的多个部分被多次调用。

与使用 Function 声明的函数不同,子例程不返回值。它们用于其副作用,例如修改变量或执行 I/O 操作。

简单的子例程

此示例展示了一个打印问候消息的基本子例程。

simple_sub.bas
Sub SayHello
    Print "Hello, FreeBasic!"
End Sub

' Call the subroutine
SayHello()

在这里,我们定义了一个打印消息的 SayHello 子例程。子例程通过其名称后跟括号来调用。这是最简单的子例程形式,没有参数或返回值。

带参数的子例程

子例程可以接受参数,使其更灵活和可重用。

sub_parameters.bas
Sub PrintSum(a As Integer, b As Integer)
    Dim sum As Integer = a + b
    Print "The sum is: "; sum
End Sub

' Call with different arguments
PrintSum(5, 7)
PrintSum(10, 20)

此子例程接受两个整数参数并打印它们的和。我们使用不同的参数调用它两次。参数允许子例程在每次调用时使用不同的数据。

ByRef 和 ByVal 参数

FreeBasic 支持按引用传递参数(默认)或按值传递。

byref_byval.bas
Sub ModifyValues(ByRef x As Integer, ByVal y As Integer)
    x = x * 2
    y = y * 2
    Print "Inside subroutine: x="; x; ", y="; y
End Sub

Dim a As Integer = 5
Dim b As Integer = 10

ModifyValues(a, b)
Print "After call: a="; a; ", b="; b

x 参数是按引用传递的,调用后的更改会保留。y 是按值传递的,因此更改是局部的。ByRef 是 FreeBasic 中的默认设置,但显式声明可以提高清晰度。

子例程中的局部变量

子例程可以声明仅在执行期间存在的局部变量。

local_vars.bas
Sub CalculateCircle(radius As Single)
    Const PI As Single = 3.14159
    Dim area As Single = PI * radius * radius
    Dim circumference As Single = 2 * PI * radius
    
    Print "Radius: "; radius
    Print "Area: "; area
    Print "Circumference: "; circumference
End Sub

CalculateCircle(5.0)

此子例程使用局部变量计算圆的属性。PI 常量和 areacircumference 变量仅在子例程内部可访问。局部变量有助于防止命名冲突。

递归子例程

子例程可以调用自身,从而实现递归解决方案。

recursive_sub.bas
Sub CountDown(n As Integer)
    If n < 0 Then Exit Sub
    
    Print n
    If n > 0 Then
        CountDown(n - 1)
    End If
End Sub

CountDown(5)

这个递归子例程从给定的数字开始倒计时到零。每次调用都会打印当前值,并使用递减的值再次调用自身。递归需要一个基本情况(此处为 n < 0)来防止无限递归。

带数组参数的子例程

子例程可以接受数组作为参数来处理集合。

array_parameter.bas
Sub PrintArray(arr() As Integer)
    For i As Integer = LBound(arr) To UBound(arr)
        Print arr(i); " ";
    Next
    Print
End Sub

Dim numbers(1 To 5) As Integer = {10, 20, 30, 40, 50}
PrintArray(numbers())

该子例程接受一个整数数组并打印其元素。我们使用 LBoundUBound 来处理任何大小的数组。参数声明中的空括号表示动态数组。

子例程重载

FreeBasic 支持具有不同参数列表的子例程重载。

sub_overload.bas
Sub Display(value As Integer)
    Print "Integer: "; value
End Sub

Sub Display(value As String)
    Print "String: "; value
End Sub

Display(42)
Display("Hello")

在这里,我们定义了两个具有不同参数类型的 Display 子例程。FreeBasic 根据参数类型选择适当的版本。重载提供了一种以相似方式处理不同数据类型的干净方法。

最佳实践

本教程涵盖了 FreeBasic Sub 关键字,并通过实际示例展示了其在不同场景下的用法。

作者

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

列出所有 FreeBasic 教程