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

  勇芳 2018-2-16 2975

此处为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



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


最新回复 (0)
返回
联系勇芳