Futurebasic/语言/变量
外观
在 FB 中,可以将变量视为数据的命名容器。该“容器”具有特定的大小和(通常)内存中的特定地址。此外,每个变量都具有特定类型,该类型决定了 FB 如何解释其内容。您可以通过将变量放在 LET
语句中“=”符号的左侧来将数据复制到变量中;或者通过显式修改变量地址的内容(通过 POKE
和 BLOCKMOVE
等语句)。某些其他 FB 语句和函数(如 SWAP
和 INC
)在您将变量作为参数包含在内时也可能修改变量。在 FB 中,变量可以具有以下任何形式
标识符[tiSuffix]
一个简单的字符串或数值变量,例如:myLong&
或theString$
。tiSuffix
是可选的类型标识符后缀,例如“$
”、“%
”、“&
”等。请参阅DIM
语句和 数据类型和数据表示,以获取类型标识符后缀的完整列表。示例myIntVar xyz&
stringVar$[offset]
(注意:方括号是变量的一部分)
此变量由位于字符串变量stringVar$
开头后的offset
字节处的单个字节组成。($
是必需的)此变量的类型是UNSIGNED BYTE
。此类变量通常用于快速检索或更改字符串中的单个字符。语句“x=stringVar$[offset]
”等效于:“x=PEEK(@stringVar$+offset)
”。语句“stringVar$[offset]=x
”等效于:“POKE@stringVar$+offset,x
”。示例firstname$[3]
pointerVar
一个指针变量。这是一个声明为POINTER
类型的标识符;它可以声明为“通用”指针,也可以声明为指向其他特定类型的指针。示例myPtr anotherPtr
handleVar
一个句柄变量。这是一个声明为HANDLE
类型的标识符;它可以声明为“通用”句柄,也可以声明为指向其他特定类型的句柄。示例myHandle thisHdl
recordName
该变量是整个记录。这可以是“伪记录”(使用DIM recordName.constant
声明)或“真记录”(使用DIM recordName AS recordType
声明)。示例myTrueRec iopb
arrayName[tiSuffix](expr1 [,expr2...])
该变量是数组中的特定元素。这可以是任何类型的数组,但tiSuffix
只能用于数字或字符串数组。请注意,整个数组不被视为变量。示例firstName$(15) recArray(3, x%)
pseudoRecordName.const1[.const2...]tiSuffix
此变量包含位于“伪记录”开头后的特定偏移量处的字节。const1
、const2
等是预先定义的非负符号常量名称(减去其前导下划线字符)或非负整数文字。此变量的地址位于(const1
+const2
+ ...)字节处,位于伪记录的开头。此变量的大小和类型由tiSuffix
确定(例如,如果tiSuffix
是“&
”,则该变量是 4 字节有符号长整数)。示例House.streetName$ pBlock.ioDrUsrWds.frRect.left%
psRecArray.const1[.const2...]tiSuffix(expr1 [,expr2...])
此变量包含位于“伪记录”数组中特定元素开头后的特定偏移量处的字节。此变量的地址位于(const1
+const2
+ ...)字节处,位于数组元素的开头。此变量的大小和类型由tiSuffix
确定。示例HouseArray.streetName$(42,6) pb.rect.bottom%(z)
addressVar&.const1[.const2...]tiSuffix
该变量包含位于addressVar&
中给定地址后的特定偏移量处的字节。此变量的地址位于(const1
+const2
+ ...)字节处,位于给定地址之后;此变量的大小和类型由tiSuffix
确定。addressVar&
必须是(有符号或无符号)长整数变量,或通用POINTER
变量。addressVar&
必须是“简单”变量;它不能是数组元素或记录字段。示例recPtr&.myField%` genericPtr.rectangle.right%
handleVar&..const1[.const2...]tiSuffix
该变量包含位于handleVar&
引用的可重定位块开头后的特定偏移量处的字节。此变量的地址位于(const1
+const2
+ ...)字节处,位于块的开头。此变量的大小和类型由tiSuffix
确定。handleVar&
必须是(有符号或无符号)长整数变量,或通用HANDLE
变量。handleVar&
必须是“简单”变量;它不能是数组元素或记录字段。示例recHdl&..thisField.thatField$ genericHandle..someField``
“真记录”的字段在 BEGIN RECORD
...END RECORD
块内定义。字段的声明数据类型可以是任何有效的类型;如果字段本身声明为另一个“真记录”类型,则该字段可以具有“子字段”,它们只是该次级记录的字段。
字段也可以声明为数组(任何类型)。在这种情况下,无论何时将字段名称包含为变量规范的一部分,都必须在其后跟括号中的下标。因此,在下面列出的每个变量描述中,每个 field
和 subfield
都采用以下形式之一,具体取决于它是否为数组字段。
对于非数组字段
field/subfield ::= fieldName[tiSuffix]
对于数组字段
field/subfield ::= fieldName[tiSuffix](sub1 [,sub2...])
以下每个变量的类型和大小只是指定的最后一个 field
或 subfield
的类型和大小。
trueRecordName.field[.subfield ...]
该变量是指定“真记录”的指定字段或子字段。示例myTrueRec.myField% stats.game(7).teamName$(1)
recordPtr.field[.subfield ...]
该变量是recordPtr
指向的“真记录”的指定字段或子字段。recordPtr
必须声明为指向特定类型记录的指针。示例ptr1.myField ptr2.arrayField$(3)
recordHdl..field[.subfield ...]
该变量是recordHdl
引用的“真记录”的指定字段或子字段。recordHdl
必须声明为指向特定类型记录的句柄。示例Hdl1..book(3).title$ Hdl2..phoneNum
arrayName(expr1[,expr2 ...]).field[.subfield ...]
此变量是“真记录”数组中特定元素的指定字段或子字段。示例
HouseArray(42,6).streetName$ season(2).game(3).player(6)
ptrArray(expr1[,expr2 ...]).field[.subfield ...]
此变量是指针数组中元素指向的“真记录”中的指定字段或子字段。该数组必须声明为指向特定类型记录的指针数组。示例myPtrArray(n).field3& ptrArray(6,2).miscInfo.chapter(7).title$
handleArray(expr1[,expr2 ...])..field[.subfield ...]
此变量是句柄数组中元素引用的“真记录”中的指定字段或子字段。该数组必须声明为指向特定类型记录的句柄数组。示例myHndlArray(7,j)..map myHndlArray(7,j)..map.quadrant(x,3).icon&
对可以分配的变量数量存在一些限制。
- 数组限制为大约 2 GB(每个)。
- 局部函数内的简单变量限制为 32K(每个局部函数)。在 FBtoC 中,局部数组的限制与全局数组的限制相同(2 GB)。(见 为什么要在 BASIC 中编写代码时转换为 C? )。
- 项目的
.MAIN
文件通常在局部函数之外分配不是全局变量的变量。这些被视为局部函数的变量,限制为 32K。在 FBtoC 中,限制与全局数组的限制相同(2 GB)。