跳转到内容

Futurebasic/语言/变量

来自维基教科书,自由的教科书

在 FB 中,可以将变量视为数据的命名容器。该“容器”具有特定的大小和(通常)内存中的特定地址。此外,每个变量都具有特定类型,该类型决定了 FB 如何解释其内容。您可以通过将变量放在 LET 语句中“=”符号的左侧来将数据复制到变量中;或者通过显式修改变量地址的内容(通过 POKEBLOCKMOVE 等语句)。某些其他 FB 语句和函数(如 SWAPINC)在您将变量作为参数包含在内时也可能修改变量。在 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
    此变量包含位于“伪记录”开头后的特定偏移量处的字节。const1const2 等是预先定义的非负符号常量名称(减去其前导下划线字符)或非负整数文字。此变量的地址位于(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 块内定义。字段的声明数据类型可以是任何有效的类型;如果字段本身声明为另一个“真记录”类型,则该字段可以具有“子字段”,它们只是该次级记录的字段。

字段也可以声明为数组(任何类型)。在这种情况下,无论何时将字段名称包含为变量规范的一部分,都必须在其后跟括号中的下标。因此,在下面列出的每个变量描述中,每个 fieldsubfield 都采用以下形式之一,具体取决于它是否为数组字段。

对于非数组字段

field/subfield ::= fieldName[tiSuffix]

对于数组字段

field/subfield ::= fieldName[tiSuffix](sub1 [,sub2...])

以下每个变量的类型和大小只是指定的最后一个 fieldsubfield 的类型和大小。

  • 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&
    

对可以分配的变量数量存在一些限制。

  1. 数组限制为大约 2 GB(每个)。
  2. 局部函数内的简单变量限制为 32K(每个局部函数)。在 FBtoC 中,局部数组的限制与全局数组的限制相同(2 GB)。(见 为什么要在 BASIC 中编写代码时转换为 C? )。
  3. 项目的 .MAIN 文件通常在局部函数之外分配不是全局变量的变量。这些被视为局部函数的变量,限制为 32K。在 FBtoC 中,限制与全局数组的限制相同(2 GB)。
华夏公益教科书