跳轉到內容

Futurebasic/語言/參考/enterproc

來自華夏公益教科書,自由的教科書

ENTERPROC 語句

[編輯 | 編輯原始碼]

ENTERPROC

[編輯 | 編輯原始碼]

✔ 外觀 ✔ 標準 ✔ 控制檯

語法 1

"語句標籤" ENTERPROC [(intVar1 [,intVar2 ...])] [語句塊] EXITPROC [= intVar3]

語法 2

"語句標籤" ENTERPROC FN fnName[(intVar1 [,intVar2 ...])] [= 型別] [語句塊] EXITPROC [= 返回值]

ENTERPROC 語句標記了一個過程塊的開始,該過程塊必須以 EXITPROC 語句結束。過程塊用於實現使用 Pascal 呼叫約定的函式,這是一種函式操作堆疊的特定方式。這種函式最常見的用途是實現 Toolbox "回撥" 程式(在 Inside Macintosh 中通常稱為 "應用程式定義例程")。這種回撥程式必須使用 Pascal 呼叫約定。

ENTERPROC 過程塊只能出現在程式的 "主" 範圍內;不能出現在 LOCAL FN 內。每個 intVar 必須是短整型(2 位元組)變數或長整型(4 位元組)變數,或 POINTERHANDLE 變數。語句塊 可以包含任何 FB 語句集合,除了另一個 ENTERPROC...EXITPROC 塊(即,過程塊不能巢狀)。所有在過程塊中引用的變數的作用域要麼是全域性的(如果變數是在 BEGIN GLOBALS...END GLOBALS 塊中早先宣告的),要麼是過程塊本身的區域性範圍。

當某些呼叫者(通常是 Toolbox 例程)引用過程塊在記憶體中的地址時,就會呼叫過程塊;你的程式可以使用 PROC"語句標籤" 函式來獲取該地址。通常,你的程式會將該地址傳遞給 Toolbox 例程,以識別過程塊作為 "回撥" 程式。當過程塊被呼叫時,intVar1intVar2 等被分配了呼叫者傳遞的值。當達到 EXITPROC 語句時,控制權會返回給呼叫者,如果指定了 intVar3(或 returnValue),則其值將返回給呼叫者。

重要的是,你應該知道呼叫者希望傳遞給你的過程塊的引數數量和型別(如果有),以及你應該相應地設定 ENTERPROC 語句中的 intVar1intVar2 (等)引數。同樣地,你應該知道呼叫者是否希望你的過程塊返回一個值,以及如果是這樣的話,呼叫者是否希望返回一個 2 位元組或 4 位元組的值。如果你使用語法 1,如果呼叫者希望返回一個值,你應該在 intVar3 中指定一個適當大小的變數;否則,你應該省略 intVar3。如果你使用語法 2,如果呼叫者希望返回一個值,你應該在 型別 引數中指定一個 2 位元組或 4 位元組型別的名稱(如 INTPOINTER),並在 返回值 表示式中指定該型別的名稱;否則,你應該省略 型別返回值。如果你沒有在你的 ENTERPROCEXITPROC 語句中正確設定輸入引數和返回值引數,那麼你的程式在呼叫過程塊時很可能會崩潰。參見 <a href="app.%20c%20data%20types.html">附錄 C</a>: 資料型別和資料表示,獲取有效 2 位元組和 4 位元組變數型別的列表。

如果你使用語法 2,你也可以使用 FN <使用者函式> 語句來執行過程塊,儘管這樣做通常沒有太大必要(當你想要建立一個將被你的程式顯式呼叫的過程時,使用 LOCAL FN 通常更好)。

注意
當你的程式啟動時,它不會自動 "跳過" 過程塊中的行,就像它跳過 LOCAL FN 中的行一樣。為了防止你的過程塊被意外執行,你應該使用 GOTO 分支到過程塊,例如

GOTO "Detour" "myProc1" ENTERPROC(var&) : EXITPROC "myProc2" ENTERPROC(var1%, var2&) : EXITPROC = result& "Detour"

或者你應該將過程塊放置在 END 語句之後,例如

'[程式主部分在這裡] END '======= 過程 ======= "myProc1" ENTERPROC(var&) : EXITPROC "myProc2" ENTERPROC(var1%, var2&) : EXITPROC = result&

CALL <地址>; 附錄 C: 資料型別和資料表示

華夏公益教科書