声明(VFB教程2-4)

  勇芳 2018-2-16 2313

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

初始化数组,变量和UDT支持变量初始化。

语法

Dim scalar_symbol [AS DataType] = expression 
Dim array_symbol ([lbound TO] ubound ) [AS DataType] => { expression [, ...] }
Dim udt_symbol AS DataType = ( expression [, ...] )

数组,变量和UDT可以在使用Dim声明时给出一个值,其语法如上所示。请注意初始化不同类型之间的重要区别。标量变量被初始化为正常赋值,使用等号。UDT和数组被赋值一个等号,后跟大于符号(= >))。数组值以逗号分隔的值由大括号括起来,UDT值以括号括起来的逗号分隔值给出。

这些初始化变量的方法可以嵌套在一起,用于复杂的赋值。例如,要初始化一个多维数组:

Dim array(1 To 2, 1 To 5) As Integer => {{1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}}

在此声明中,最左边的维度的值作为5索引数组给出。嵌套允许初始化任何维度的数组。

UDT和数组也可以彼此嵌套。例如,以下代码声明并初始化UDT数组。

Type mytype
    var1 As Double
    var2 As Integer
    var3 As ZString Ptr
End Type

Dim MyVar(2) As mytype => _
    { _
        (1.0, 1, @"Hello"), _
        (2.0, 2, @"GoodBye") _
    }

对于模块级,静态或全局变量,初始化值必须是常量表达式。否则FreeBASIC将报告编译时错误。

变量,对象和数组的可见性和生命周期

变量,对象或数组的存储类确定内存赋值的时间和位置以及内存何时被销毁。FreeBASIC有两个存储类:automatic 和static .

Automatic 变量,对象和数组生命周期从声明点开始,并在结束时离开它们声明的范围。

Automatic 实体将保证为声明它们的块的每个实例提供唯一的存储。例如,在过程中声明的automatic 变量将被赋值在不同的地址,并且对于每次调用过程都具有唯一的状态(值)。

Automatic 使用Dim,ReDim和Var关键字定义变量,对象和数组,而不使用Shared说明符。

变量,对象和数组的内存赋值在程序堆栈上。

Automatic 变量,对象和数组没有链接。


Static 变量,对象和数组的生命周期从程序创建开始,并以程序终止结束。

Static 实体被保证具有与声明它们的块的每个实例相同的存储。例如,在一个过程中声明的static 变量将被赋值在同一个地址上,并且在对该过程的每个调用中保留其状态(值)。

Static 使用Static关键字声明变量,对象和数组。使用Shared说明符声明的实体是隐式static .在使用Static说明符声明的过程中声明的所有实体也隐式static .

static 变量,对象和数组的内存在可执行文件的.BSS部分或.DATA部分中赋值,如果它们在定义时被初始化。Static 可变长度数组必须声明为空,具有空的下标范围列表;它们的元素数据仍然被赋值在可用存储中(当它们被调整大小时),但是内部数组数据被赋值在可执行文件的.DATA部分中,以允许元素数据在整个程序执行期间持续存在。

Static 变量,对象和数组默认内部链接,除非以前声明使用Extern或Common关键字。

变量和对象的可见性和访问规则

变量的范围是指其在程序中的可见性。变量在其声明的范围之外是不可见的(不能被访问)。声明变量的位置和方式决定其范围。

在FreeBASIC中,有4种范围:local ,shared ,common 和common shared .这些范围中的每一个具有不同的可见性规则,具体如下。

本地范围

在本地作用域中声明的变量仅在声明它们的IF,FOR,SCOPE,函数或模块的最本地实例中可见。

If....
DIM a as long  '只在 IF 内有效
endif

Sub,Function,主体和每个复合语句隐式定义一个新的本地作用域。

Sub ... Function ...
Dim a as long '只在函数或过程里有效

End Sub  End Sunction

使用Dim或ReDim显式声明的变量占据其声明的本地最大块的范围。

隐式变量采用最先使用它们的局部最大Scope...End Scope块的范围,否则将使用Sub,Function或其主体的范围。

在本地范围内,模块级代码和功能级代码之间没有可见性。此外,在块决策或循环语句中定义的变量将仅在其尺寸标注的块内可见。在模块的本地范围内声明的变量在该模块中的任何函数中都不可见。类似地,在函数内声明的局部变量在模块级代码中也不可见,也不会在模块中显示任何其他函数。


在Scope块内声明的变量只能被声明为本地作用域,并且在块外部不可见。Scope块,但是,继承了周围的范围,所以在Scope块之外声明的局部变量将在(see example program )内部可见。


您可以通过使用Dim语句明确地声明变量为本地作用域,或者通过简单地引入变量(see Implicit Declarations )来隐式地声明变量。

共享范围

在模块的共享作用域中声明的变量对该模块的模块和所有功能都是可见的。

Dim Shared a As long   '所有的VFB工程里的模块过程有效    
Sub..

end Sub

与本地范围不同,共享范围使模块级变量对该模块的功能可见。换句话说,模块shares 具有其功能的声明。


变量只能在模块级别声明为共享作用域。也就是说,只有模块可以共享变量。函数和Scope块都不能在共享作用域中声明变量,因此在此处声明的变量只能是该函数或块的本地变量。


您可以使用带有Shared关键字的DIM语句来将变量声明为共享作用域。


共同范围

所有模块都可以看到在公共范围内声明的变量。(一般情况,在VFB里用不到这个)


使用Common声明的变量对于具有匹配的Common变量声明的其他模块是可见的。声明的变量名称必须与模块之间匹配。

公共共享范围

在公共共享范围中声明的变量对于所有模块和这些模块的所有功能都是可见的。


使用Common声明的变量对于具有匹配的Common变量声明的其他模块是可见的。声明的变量名称必须与模块之间匹配。在一个模块中,Shared声明修饰符给出了变量模块范围,并使该变量对所有子函数和函数都可见。


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