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