跳轉到內容

Futurebasic/語言/參考/fn userfunction

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

FN <userFunction>

[編輯 | 編輯原始碼]

語句/函式

[編輯 | 編輯原始碼]
(+) 外觀 (+) 標準 (+) 控制檯

[result =] FN functionName[(param1 [,param2 ...])]

執行由functionName指定的使用者函式,並可選地返回一個數值或字串結果。使用者函式必須是在程式中先前位置定義或原型化的函式。使用者函式使用LOCAL FNLONG FNDEF 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

華夏公益教科書