跳轉到內容

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)。
華夏公益教科書