用户自定义变量
翻译自原文档:https://osdn.net/projects/emuera/wiki/UserVars
也可跳转至:风飏@df32翻译版
#DIM
和#DIMS
可以用来定义任何你喜欢的变量。
在一个函数中定义的变量成为私有变量,只能在该函数中使用,而在头文件(ERH)中定义的变量成为广域变量,可以从ERB的所有部分引用。
格式(用于私有变量)
在你想定义变量的函数声明下,写上#DIM(S) <变量名>, <元素数>{, <元素数>{, <元素数>}}
。
<变量名>是一个任意的字符串,类似于函数名,不以数字开头,只由符号"_"组成。
所有的<元素数>都是任意的整数或1到1000000范围内的常数表达式。 如果省略,它被设置为1。
根据给定的<元素数>的多少,被定义的变量的尺寸会发生变化。 最大的维度是三个,你不能定义一个超过四个维度的变量。
在一个函数中可以定义多个#DIM(S)
私有变量。
这允许在该函数中使用一个由<变量名>指定的变量。
变量可以分配给<元素数>指定的元素数,并且不保存。 初始值是0或一个空字符串。
#DIM
使该变量成为一个整数类型的变量,#DIMS
使其成为一个字符串类型的变量。
用#DIM(S)
定义的变量也可以作为函数的参数使用。 你也可以设置初始值。
@FIND_CSTR(KEY, VALUE)
#FUNCTION
#DIM LCOUNT
#DIM KEY
#DIMS VALUE
SIF KEY < 0 || KEY >= VARSIZE("CSTR")
RETURNF -1
FOR LCOUNT, 0, CHARANUM
SIF LCOUNT == MASTER
CONTINUE
SIF CSTR:LCOUNT:KEY == VALUE
RETURNF LCOUNT
NEXT
通过根据变量的用途对其进行命名,并设置适当的元素数量,就像上面的分割一样,通过使用更多的非连续的LOCAL,也许可以提高可读性。
设置默认值
当声明一个一维数组变量时,可以定义一个默认值。
可以省略初始值的数组中的元素数,在这种情况下,初始值将自动成为数组中的元素数。
如果你没有省略数组元素的数量,该数字将被用作数组中的元素数量。
如果元素的数量没有被省略,而初始值的数量大于元素的数量,就会出现错误。
;HOGE中的元素数是3,因为元素数被省略了。
#DIM HOGE = 1,2,3
;PUGE中的元素数是100,因为没有省略元素数
#DIM PUGE,100 = 4,5,6
;错误(初始值的数量大于指定的元素数量)。
#DIM HIGE,1 = 7,8,9
;也可以是一个字符串变量(由一个字符串表达式指定)。
#DIMS SHOGE = "A", "B", "C"
注意,不能为多维数组定义默认值。
动态变量
如果你在变量名前加上DYNAMIC,如#DIM(S) DYNAMIC <变量名>, <元素数>
,定义的变量将被动态分配。
具体来说,当函数被调用时,该变量将被分配,当函数终止时,该变量及其值将消失。
(由于RESTART
指令是 "返回到函数的开始 "指令,即使是动态分配的变量也不会被重置)。
如果你在一个函数中调用自己(递归),变量会被分配为你递归的次数,所以递归行为是稳定的。
然而,它比没有DYNAMIC
(静态变量)的情况要慢。
常量
当定义一个一维数组变量时,在变量名称前插入CONST
将定义一个一维数组常数。
与初始值一样,只有一维数组变量可以被定义。
常量在声明时必须有一个初始值,不能通过替换来改变。
由于其性质,CONST
不能与GLOBAL
、SAVEDATA
、REF
和DYNAMIC
关键字一起使用。
数组中的元素数量可以不加说明,但如果元素数量与初始值的数量不一致,就会发生错误。
;定义一个一维常数组
#DIM CONST HOGE = 1,2,3
;错误(初始值的数量与元素的数量不匹配)。
#DIM CONST PUGE,100 = 4,5,6
;也可以是一个字符串变量(由一个字符串表达式指定)。
#DIMS CONST SHOGE = "A", "B", "C"
参考类型变量
参考型变量可以通过在变量名称前使用REF关键字来定义。
整数型1至3维数组和字符串型1至3维数组分别声明如下:
#DIM REF HOGE1DIM,0
#DIM REF HOGE2DIM,0,0
#DIM REF HOGE3DIM,0,0,0
#DIMS REF PUGE1DIM,0
#DIMS REF PUGE2DIM,0,0
#DIMS REF PUGE3DIM,0,0,0
如果逗号的数量相同,可以省略逗号;如果是一维数组,也可以省略逗号。
引用变量没有实体,操作引用变量将导致该变量被REF
指令(从ver1.815开始不可用)或通过引用传递的方式操作。
关于通过引用传递的更多信息,请参阅函数--通过引用传递参数。
格式(用于广域变量)
当#DIM(S)
写在头文件(ERH)中时,它不是在ERB中定义的一个私有变量,而是一个,与ERB中定义的私有变量不同,#DIM(S)
是一个广域变量,可以从ERB的任何地方引用。
与私有变量不同,DYNAMIC
和STATIC
之间没有区别,也不可能用REF来定义引用类型的变量,但是用CONST
的常量可以用同样的方式来定义。
在不属于DIM
的函数中,可以将保存的变量、全局变量和字符变量定义为函数。
详情请见头文件(ERH)部分。
限制条件
不能使用与指令相同的名称
不可能定义一个与指令同名的变量,如下所示:
;报错
#DIM PRINTFORM
#DIM SELECTCASE
#DIM CALL
#DIM RETURN
#DIM GOTO
#DIM SQRT
#DIM DATAFORM
#DIM NOSKIP
#DIM FUNC
#DIM ENDFUNC
可以定义与函数/预处理器同名的变量,但不建议使用。
;不推荐
#DIM EVENTFIRST
#DIM COMF32
#DIM COMABLE15
#DIM SHOW_ABLUP_SELECT
#DIM DIM
#DIM PRI
#DIM ONLY
#DIM SKIPSTART
来自函数外的干扰
与LOCAL@HOGE
的LOCAL
不同,没有办法引用或将私有变量分配给其他函数。