Futurebasic/語言/參考/fn userfunction
| (+) | 外觀 | (+) | 標準 | (+) | 控制檯 |
[result =] FN functionName[(param1 [,param2 ...])]
執行由functionName指定的使用者函式,並可選地返回一個數值或字串結果。使用者函式必須是在程式中先前位置定義或原型化的函式。使用者函式使用LOCAL FN、LONG FN或DEF FN <expr>語句定義。使用者函式使用DEF FN <protoType>語句原型化。
如果使用者函式返回一個值,您可以使用FN <userFunction>作為數值或字串表示式的一部分,例如:
count% = 3 * FN NumFish%(x) + 7
如果使用者函式不返回值,則應將FN <userFunction>用作獨立語句。
如果函式定義包含引數列表,則在呼叫函式時必須提供相同數量的引數(在param1、param2等中),並且傳遞的引數必須是相容的型別。相容的型別總結如下(並非所有這些型別都適用於所有型別的函式;請參閱LOCAL FN、LONG FN的單獨描述
<spacer size="3" type="horizontal">和 DEF FN <expr>)
<img src="f/fn%20userfunction.jpg" alt="" height="327" width="554" border="0">
注意
1. 非整數值在移入整數或指標變數之前會四捨五入到整數。
2. 如果傳遞的數值超出了正式變數型別的範圍,則可能會得到意外結果,或者可能會得到溢位錯誤。
3. 如果傳遞的字串值超過了正式變數的最大大小,則字串將被截斷。
4. 如果此處指定了變數,則該變數的地址將被複制到形式引數(addr&或 p)中。如果指定了以“=”開頭的長整型表示式,則該表示式的值將被複制到addr&或 p 中。
5. 陣列必須是數值或字串陣列(而不是記錄陣列)。陣列的所有元素都可以被函式訪問。在函式中對陣列元素進行的任何更改也會影響函式外部的陣列。請注意,如果正式 FN 定義中指定的陣列的型別或維數與在呼叫函式時傳遞的陣列不同,則可能會得到意外結果,甚至會導致崩潰。(在嘗試此操作之前,請確保您知道自己在做什麼!)
6. 如果此處指定了記錄變數,則該記錄的地址將被複制到形式引數(p)中。如果指定了長整型表示式,則該表示式的值將被複制到 p 中。
如果函式定義沒有引數列表,則在呼叫函式時不能包含任何引數(也不能包含括號)。
在大多數情況下,您在FN <userFunction>中指定的引數是“按值傳遞”。這意味著使用者函式會收到引數值的一個私有副本;如果函式更改了該副本,則不會影響FN呼叫中使用的引數的值。
在少數情況下,您在FN <userFunction>中指定的引數是“按引用傳遞”。這意味著使用者函式會收到您指定引數的地址。如果函式更改了該地址處的內容,它會影響您傳遞的引數的值。當您在函式定義中使用以下型別的形式引數宣告時,引數是按引用傳遞的
- 指標(
p AS POINTER [TO someType])。(如果在呼叫函式時指定了記錄變數,則引數按引用傳遞。) - 地址引用(
@addr&; p AS POINTER [TO someType])。(如果在呼叫函式時指定了變數,則引數按引用傳遞。) - 陣列宣告(
arr[suffix](dim1[,dim2...]))
您還可以使用VARPTR函式(VARPTR(var)或@var)在呼叫函式時傳遞變數或陣列的地址(如果您這樣做,則在 FN 定義中指定長整型變數或指標變數作為形式引數)。這是另一種讓函式直接訪問構成變數或陣列的記憶體的方法,使它有可能改變其值。
注意:沒有辦法直接將記錄的內容傳遞給函式。要讓函式訪問記錄的內容,請按引用傳遞記錄,或者直接傳遞記錄的地址(在呼叫函式時傳遞VARPTR(recVar)或@recVar)。
FN <userFunction>呼叫可以出現在函式定義(或原型)位置下的任何地方。它可以出現在程式的“主”範圍內,也可以出現在其他函式中。它甚至可以出現在它正在呼叫的函式中——這使您能夠實現所謂的“遞迴”函式(呼叫自身的函式)。
LOCAL FN; LONG FN; DEF FN