【VFB】变量和数据类型(VFB教程2-3)

本文介绍了FreeBASIC编程语言的基础知识,包括变量、常量、数组等核心概念及其使用方法。详细讲解了如何定义和使用不同类型的变量及常量,以及数组的创建、索引和调整大小等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此处为VisualFreeBasic编程教程(从零开始学或VB进阶)的子章节部分,全部目录点链接。

变量

变量是可以操纵的名称符号。它们使用由字母,数字和字符“_”组成的名称进行声明和引用。这些引用名称不能包含大多数其他符号,因为这些符号是FreeBASIC编程语言的一部分。它们也不能包含空格。

在FreeBASIC中,可以使用Dim语句定义变量。

根据给定该变量的Dim声明的方式和方式,变量可供稍后访问。根据变量的范围,定义的变量可以在程序的主要区域内,程序内,整个模块中或整个程序中可用。

当变量作为参数传递给诸如Function或Sub之类的过程时,变量也可用。

在使用Dim语句声明变量之后,可以将它们赋值,传递给过程,并在表达式中使用,只要它们的标准数据类型类似。有时,变量会在表达式中使用之前自动转换为其他数据类型,或作为参数传递给过程。

'--------------------------------------------------------------------------------
Function FORM1_COMMAND1_BN_CLICKED ( _
                                   ControlIndex     As Long, _      ' 控件数组的索引
                                   hWndForm         As HWnd, _      ' 窗体句柄
                                   hWndControl      As HWnd, _      ' 控件句柄
                                   idButtonControl  As Long   _     ' 按钮的标识符
                                   ) As Long
  Dim FirstNumber As Integer
  Dim Shared SecondNumber As Integer
  
  FirstNumber = 1
  SecondNumber = 2
  
  PrintConstants ()
  Print FirstNumber, SecondNumber, ThirdNumber '这将打印1 2 0
End Function
'--------------------------------------------------------------------------------
Sub PrintConstants ()
    Dim ThirdNumber As Integer
    ThirdNumber = 3
    Print FirstNumber, SecondNumber, ThirdNumber '这将打印0 2 3
End Sub


常量

常量是定义后不能更改的数字。例如,5总是意味着相同的数字。

在FreeBASIC中,常量定义与使用Const命令的变量定义不同。

这样的常量然后可以在全部范围内使用,这意味着一旦定义,您可以在程序中的任何地方使用该词来指代常数。

在使用Const命令定义后,不能修改常量。如果代码尝试更改常量,则会在代码编译时产生错误消息。

Const FirstNumber = 1
Const SecondNumber = 2
Const FirstString = "第一个字符串"
'--------------------------------------------------------------------------------
Function FORM1_COMMAND1_BN_CLICKED ( _
                                   ControlIndex     As Long, _      ' 控件数组的索引
                                   hWndForm         As HWnd, _      ' 窗体句柄
                                   hWndControl      As HWnd, _      ' 控件句柄
                                   idButtonControl  As Long   _     ' 按钮的标识符
                                   ) As Long
  Print FirstNumber, SecondNumber '这将打印1 2
  Print FirstString '这将打印第一个字符串。
  PrintConstants ()
End Function
'--------------------------------------------------------------------------------
Sub PrintConstants ()
    Print FirstNumber, SecondNumber '这也将打印1 2
    Print FirstString '这也将打印第一个字符串。
End Sub


数组

多维容器类型。

是变量的特殊类型,作为多个值的容器,数组可以存储任何类型的元素,并且其所有元素共享相同的类型。

元素和位置

数组存储的值是其元素。数组的每个元素都有一个对应的位置,它是一个Integer值,从数组的下标到其上标。这些位置用于使用操作符 ()访问数组中的各个元素,该位置会返回对该位置的元素的引用。数组中的有效位置大于或等于其下限,小于或等于其上限。

' Create an array of 3 elements all having the value zero (0.0f).
Dim array(1 To 3) As Single
 
' Assign a value to the first element.
array(1) = 1.2
 
' Output the values of all the elements ("1.2 0 0").
For position As Integer = 1 To 3
    Print array(position)
Next

尺寸和边界

数组的大小等于在任何给定时间存储的元素的数量。数组的大小可以为零(0),这意味着它不存在任何值.如果数组的大小大于零,则存储了许多元素。数组的大小等于其上限和下限之间的差异,或UBound(array ) - LBound(array ) + 1.

下限和上限不仅可以确定数组的大小,还可以确定各个元素的有效位置。例如,具有零(0)和四(4)的下限和上限的数组存储五(5)个元素,第一个元素在位置0,最后一个在位置5。这些边界可以在声明数组时被指定,或者对于某些数组,通过调整数组的大小可以改变。可以使用LBound和UBound分别检索数组的下限和上限。

创建或调整数组大小时,如果未指定下限,则默认为零(0)。

' Declares and initializes an array of four integer elements.
Dim array(3) As Integer = { 10, 20, 30, 40 }
 
' Outputs all of the element values (" 10 20 30 40").
For position As Integer = LBound(array) To UBound(array)
    Print array(position) ;
Next

固定长度和可变长度

有两种基本类型的阵列:两者之间的主要区别在于,固定长度数组的界限永远不会改变,也就是说,它们总是将相同数量的元素存储在同一位置。可变长度的数组边界可以改变,影响元素的数量和元素的位置。

由于固定长度的数组永远不会改变大小,编译器会根据数组的存储类选择为静态存储器或程序堆栈中的数组元素的存储空间 .这可以是一个优点,因为创建这些类型的阵列的成本不包括任何不利的运行消耗。使用Dim声明固定长度的数组。必须至少指定一个上限,所有边界都必须是编译时常数值,例如数字文字,Const变量或Enum枚举器。

可变长度的数组可以改变大小,因此编译器选择在运行时在空闲存储器中为数组元素赋值内存。这里的优点当然是能够动态地调整数组的大小,但是,运行时在创建,调整大小或销毁时性能可能会有所不同。可变长度数组使用Dim和ReDim声明。当使用Extern,Static或Dim时,下限和上限可以保留未指定 - 导致一个空数组 - 或者必须有一个变量值,例如Integer变量或Function结果。可以使用ReDim来调整现有的可变长度数组的大小,给出不同的下限和/或上限。

' Creates a fixed-length array that holds 5 single elements.
Const totalSingles = 5
Dim flarray(1 To totalSingles) As Single
 
' Creates an empty variable-length array that holds integer values.
Dim vlarray() As Integer
 
' Resizes the array to 10 elements.
ReDim vlarray(1 To 10) As Integer

多维数组

目前为止讨论的阵列是一维的,也就是说,元素通过单个位置访问。一维数组可以被认为是简单的一行元素。数组也可以有多个维度;使用两个或多个位置访问阵列的单个元素。二维数组使用两个位置 - 一个行和一个列位置来引用单个元素,如网格或表格。三维阵列使用三个位置 - 一列,也可能是深度位置 - 来指代单个元素,如立方体。四维阵列可以被认为是一个或多个三维阵列,等等。多维数组的声明就像一维数组,只不过指定了多个下限和上限范围。

' Take Care while initializing multi-dimensional array
Dim As Integer multidim(1 To 2,1 To 5) = {{0,0,0,0,0},{0,0,0,0,0}}

固定长度数组

使用Dim或Static关键字声明一个固定长度的数组,后跟一个变量标识符,一个括号的边界列表和一个元素数据类型.

'' Defines a one-dimensional fixed-length array of type INTEGER having automatic storage.
Dim arrayOfIntegers(69) As Integer
 
'' Defines a one-dimensional fixed-length array of type SHORT having static storage.
Static arrayOfShorts(420) As Short

有多种方法来指定数组的元素数量。每个阵列可以有1或8维。每个维度都有一个下限和一个上限。

Dim a(1) As Integer  '' 1-dimensional, 2 elements (0 and 1)
Dim b(0 To 1) As Integer  '' 1-dimensional, 2 elements (0 and 1)
Dim c(5 To 10) As Integer  '' 1-dimensional, 5 elements (5, 6, 7, 8, 9 and 10)
 
Dim d(1 To 2, 1 To 2) As Integer  '' 2-dimensional, 4 elements: (1,1), (1,2), (2,1), (2,2)
Dim e(255, 255, 255, 255) As Integer '' 4-dimensional, 256 * 256 * 256 * 256 elements

对于要声明为固定长度的数组,必须使用数字字面值或Const值或Enum常量指定边界。

Const myLowerBound = -5
Const myUpperBound = 10
 
'' Declares a one-dimensional fixed-length array, holding myUpperBound - myLowerBound + 1 String objects.
Dim arrayOfStrings(myLowerBound To myUpperBound) As String
 
'' Declares a one-dimensional fixed-length array of bytes,
'' big enough to hold an INTEGER.
Dim arrayOfBytes(0 To SizeOf(Integer) - 1) As Byte

可变长度数组

可调整大小的均匀数据结构。也称为“动态数组”。

使用Dim或ReDim关键字声明可变长度的数组,后跟一个变量标识符,括号中的边界列表和元素数据类型.对于要声明为可变长度的数组,必须以未知边界或变量(非常量)边界声明。ReDim总是定义可变长度的数组,指定的边界是否不变。

'' Declares a one-dimensional variable-length array of integers, with initially 2 elements (0 and 1)
ReDim a(0 To 1) As Integer
 
'' Declares a 1-dimensional variable-length array without initial bounds.
'' It must be resized using Redim before it can be used for the first time.
Dim b(Any) As Integer
 
'' Same, but 2-dimensional
Dim c(Any, Any) As Integer
 
Dim myLowerBound As Integer = -5
Dim myUpperBound As Integer = 10
 
'' Declares a 1-dimensional variable-length array by specifying variable (non-constant) boundaries.
'' The array will have myUpperBound - myLowerBound + 1 elements.
Dim d(myLowerBound To myUpperBound) As Integer
 
'' Declares a variable-length array whose amount of dimensions will be determined
'' by the first Redim or array access found. The array has no initial bounds and must
'' be resized using Redim before it can be used for the first time.
Dim e() As Integer

调整

调整可变长度数组的大小是指使用不同边界“重新定义”数组,从而允许数组增长或缩小。新下标范围以外的元素[s]将被删除;对象元素将被破坏。如果将数组调整为较大的大小,则新增元素将以零或null 值初始化;对象元素是默认构造的。使用与定义相同的形式使用ReDim关键字调整可变长度数组的大小。在这种情况下,可以从ReDim语句中省略元素数据类型。

'' Define an empty 1-dimensional variable-length array of SINGLE elements...
Dim array(Any) As Single
 
'' Resize the array to hold 10 SINGLE elements...
ReDim array(0 To 9) As Single
 
'' The data type may be omitted when resizing:
ReDim array(10 To 19)

调整数组大小不能更改其维数,而不能更改每个维度的边界。

默认情况下,调整大小时,可变长度数组的元素值将丢失。要在调整大小期间保留以前的元素值,请使用Preserve关键字。

数组索引

数组索引是用于访问使用Dim命令创建的变量的排列的数字。

以下示例说明了使用数组元素。

如果我们有一个数组myArray,元素为1到10,填充随机数据:

Index        Data
1              5
2              2
3              6
4              5
5              9
6              1
7              0
8              4
9              5
10             7

可以通过指向数组元素的索引来单独访问每条数据:

Print myArray(5)

打印myArray第五个元素中包含的数据会产生以下输出:

 9

 要更改数组的内容,请像其他变量一样使用它:

myArray(3) = 0

要打印myArray(3)的内容,请使用以下命令:

Print myArray(3)

其结果是:

 0

 

可以使用另一个变量对数组元素建立索引。在这个例子中,我们将数组中的所有元素设置为零:

    Dim a As Integer
    For a = 1 To 10
      myArray(a) = 0
    Next a

将随机数组元素更改为随机值:

    Dim Index As Integer
    Dim Value As Integer
    index = Int(Rnd(1) * 10) + 1 'This line will simply return a random value between 1 and 10
    Value = Int(Rnd(1) * 10) + 1 'This line will do the same
    myArray(index) = Value

例子

Dim Numbers(1 To 10) As Integer
Dim Shared OtherNumbers(1 To 10) As Integer
Dim a As Integer
 
Numbers(1) = 1
Numbers(2) = 2
OtherNumbers(1) = 3
OtherNumbers(2) = 4
 
PrintArray ()
 
For a = 1 To 10
 Print Numbers(a)
Next a
 
Print OtherNumbers(1)
Print OtherNumbers(2)
Print OtherNumbers(3)
Print OtherNumbers(4)
Print OtherNumbers(5)
Print OtherNumbers(6)
Print OtherNumbers(7)
Print OtherNumbers(8)
Print OtherNumbers(9)
Print OtherNumbers(10)
 
Sub PrintArray ()
 Dim a As Integer
 For a = 1 To 10
   Print otherNumbers(a)
 Next a
End Sub

内置数据类型

整数类型

存贮整数值的类型,范围决定于数据类型的尺寸和有无正负符号

浮点类型

存储实数值的类型,其范围和精度由数据类型的大小决定。

数据类型修饰符

指定标准或用户定义的数据类型的附加特征。

字符串类型

存储或指向字符数组的类型。

类类型

提供直接使用或由用户定义类型扩展的特殊功能的类型

整数类型

Byte和UByte

存储整数值的8位宽数据类型。

Short和UShort

存储整数值的16位宽数据类型。

Long和Ulong

存储整数值的32位宽数据类型。

Integer和UInteger

存储整数值的32位或64位宽数据类型。

LongInt和ULongInt

存储整数值的64位宽数据类型。

浮点类型

Single

存储实数值的32位宽数据类型。

Double

存储实数值的64位宽数据类型。

数据类型修饰符

Const

指定只读类型。

Pointer和Ptr

将类型修改为指针类型。

Unsigned

指定无符号整数类型。

字符串类型

String

具有内置内存管理的固定长度和可变长度的字符串。

ZString

固定长度和可变长度的以null结尾的字符串。

WString

固定长度和可变长度的以null结尾的宽字符串的字符串。

类 类型

Object

超级类提供运行时类型信息

数值类型

类型大小在位格式最小值最大值字面后缀SIG。数字
BYTE8有符号整数-128+127 2+
UBYTE8无符号整数0+255 2+
SHORT16有符号整数-32768+32767 4+
USHORT16无符号整数065535 4+
LONG32有符号整数-2147483648+2147483647&, l9+
ULONG32无符号整数04294967295ul9+
INTEGER32/64 [*]有符号整数[*][*]%[*]
UINTEGER32/64 [*]无符号整数[*][*]u[*]
LONGINT64有符号整数-9 223 372 036 854 775 808+9 223 372 036 854 775 807ll18+
ULONGINT64无符号整数0+18 446 744 073 709 551 615ULL19+
SINGLE32浮点[**]+/-1.401 298 E-45[**]+/-3.402 823 E+38!, f6+
DOUBLE64浮点[**]+/-4.940 656 458 412 465 E-324[**]+/-1.797 693 134 862 316 E+308#, d15+



[*] 整数和UInteger数据类型随平台而异,与指针的大小相匹配。
[**] 浮点类型Single和Double的最小值和最大值分别为最接近零的值,最接近正负无穷大的值。

字符串类型

类型字符大小(字节)最小尺寸(以字符)最大尺寸(以字符)字面后缀
string10[**]+2147483647$
zstring10[**]+2147483647[N/A]
WSTRING[*][*]0[*,**]+2147483647[N/A]



[*] Unicode或“wide”,字符大小和可用性随平台而异。
[**] 所有运行时库字符串过程都会获取大小和位置的整数值。 实际的最大尺寸将随存储位置和/或平台而变化(较小)。 

阵列,数组

最大下标范围每个维度的最大元素最小/最大尺寸最大大小(以字节为单位)
[*][-2147483648, +2147483647][*]+21474836471/9[*]+2147483647



[*] 所有运行时库数组过程都会为下标和索引生成整数值。 实际限制将随维度数量,元素大小,存储位置和/或平台而变化(较小)。

### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值