用户定义变量(风飏@df32翻译版)

翻译自原文档:https://osdn.net/projects/emuera/wiki/UserVars

译者:风飏@df32open in new window

也可跳转至:原版

预处理指令#DIM#DIM用来声明变量。

在函数定义中声明的变量为私有变量,只能在该函数中使用。 在头文件(ERH)中声明的变量为广域变量,可以从ERB脚本的任何位置中引用。

私有变量的书写格式

#DIM(S) <变量名>, <元素数> {,<元素数>{,<元素数>}}

在函数声明下,使用上述格式声明变量。

  • <变量名> 与函数命名规则相同,以非数字的字符开始的任意字符串。
  • <元素数> 100万以内的数字(默认为1),指定数组最多能访问的元素数量。
  • 数组变量最高为3维。
  • 数组变量可以访问<元素数>指定数量以内的元素。元素的初始值为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

使用#DIM(S)声明的私有变量代替内置变量LOCAL(S)可以提高代码的可读性。

定义初始值

一维数组变量在声明时,可以同时定义初始值。

若声明变量时省略数组的元素数,则数组变量的元素数将依据初始值的个数来定义。

若没有省略数组的元素数量,则会正常设置数组的元素数量。

若没有省略数组的元素数量,而初始值的个数大于元素数量,则会抛出错误。

;省略元素数量,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"

注意:不能在声明多维数组的同时定义其初始值。

动态变量

#DIM(S) DYNAMIC <变量名>,<元素数>

如果在变量名前加上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维数值型和字符串型的声明分别如下:

#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

可以只写逗号,省略数字0;如果是一维数组,可以省略逗号和0

引用型变量没有实体,REF指令可以操作变量的引用(从ver1.815开始不可用)或用于函数传递引用参数。

关于函数传递引用参数的更多信息,请参阅函数--通过引用传递参数

广域变量的书写格式

#DIM(S)在ERH头文件中使用时,#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不同,私有变量无法从函数外部访问。