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)。