用户自定义变量

翻译自原文档: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不能与GLOBALSAVEDATAREFDYNAMIC关键字一起使用。

数组中的元素数量可以不加说明,但如果元素数量与初始值的数量不一致,就会发生错误。

;定义一个一维常数组
#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的任何地方引用。

与私有变量不同,DYNAMICSTATIC之间没有区别,也不可能用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@HOGELOCAL不同,没有办法引用或将私有变量分配给其他函数。