-
- RPG中数组和DS使用方法总结
- 2011-08-30
ARRAY
一 array与table的区别
Array:可以使用下标,进行顺序访问或随即访问
Table:不可以使用下标,只能顺序访问。只能以TABxxx开头。
注:table虽然和array的功能相似,但是array要比table灵活很多。Table可以淘汰了,了解table的原因是维护老的代码时可能会用到。
二 array的类型和key word
1有三种类型的array,分别是compile time array、run time array、pre-run time array。
2与array相关的key word:
DIM(number) 定义数组中元素的数量
ASCEND/DESCEND 元素在数组中升序/降序排序
PERRCD(number) 对于compile time array每一行中元素的个数
CTDATA 定义compile time array
FROMFILE/TOFILE 定义pre-run time array会用到
EXTFMT
举例:
//array1定义10个元素,每个长度为5
D Array1 S 5 0 DIM(10)
//array2是compile time array,共6行,每行3个元素,每个元素10个长度,升序排序
D Array2 S 10 DIM(6) PERRCD(3) CTDATA ASCEND
//compile time array要在程序的结尾定义数据
** CTDATA ARRAY2
Element1 Element2 Element3
Element4 Element5 Element6
Element7 Element8 Element9
Element10
注:如果compile time array的数据发生变化,那么要更改程序源代码中的元素值,并要重新编译程序。
在程序的末尾要有** CTDATA 。建议使用** CTDATA array_name的方式,但是要注意array_name要与D-spec 定义的array_name要一致;仅用 **CTDATA(不指定array_name)时要注意** CTDATA的数据按照D-spec定义的array的顺序进行匹配。并且两者不能混着用。
3 Index:index不能为0或负数,不能大于元素个数。
三 array相关的%BIF
1 %Xfoot 数组求和
Sum = %Xfoot(array_name)
2 %LookUpxx 查找(%TLookUpxx for table)
Index = %LookUpXX(argument:array{:satrtindex})
%LookUp 查找第一个=argument元素的index
%LookUpLE 查找第一个<=argument的元素index
%LookUpLT 查找第一个<argument的元素的index
%LookUpGE 查找第一个>=argument的元素的index
%LookUpGT 查找第一个>argument的元素的index
注:除了%LookUp外,使用其他的%LookUpxx的数组必须是排过序的。
3 %Size 返回变量或常量所占的字节数
Size = %Size(name{:*all})
D SmallFiled S 5P 2
D MyArray S 5 DIM(%Size(Smallfield))
SizeSmall = %Size(SmallField) //SizeSmall = 3
ArraySize = %Size(MyArray) //ArraySize = 5 单个元素的size
Arraysize = %Size(Myarray:*all) //Arraysize = 150 所有元素的size
4 %Elem 返回数组中元素的个数
Number = %Elem(array_name)
Data structure
Data structure是什么?答:数据结构。评:废话。—_—!!
一 DS的key word
OCCURS(number) 定义DS数组
OVERLAY(name:{pos}) 在DS中重定义sub-filed
PREFIX(prefix) 为外部的字段增加前缀。
EXTNAME(name:{fmt_name}) 参照的外部文件格式,文件不需要在F-spec定义
EXTFLD(field_name) 将外部数据格式的字段重命名
QUALIFIED 指定引用
LIKEDS 引用DS的格式,隐含自动声明QUALIFIED
LIKEREC 引用外部文件,文件要在F-spec中定义,隐含自动声明QUALIFIED
LIKE 参照字段定义
简单的例子:
FItem_PF IF E K DISK
D keystr DS LIKEREC(Item_fmt)
*
D #lda E DS EXTNAME(lda)
*
D cust DS QUALIFIED
D name 50a
D id 10i 0
*
D part DS QUALIFIED
D name 25a
D id 10i 0
*
D part1 DS LIKEDS(part)
D part2 DS LIKEDS(part)
二 DS的用法
1 group field(字段组合使用)
D Stamp DS
D OrderNo 5
D OrderDate 6 0
D OperInit 3
2 subdivide field(字段拆分使用)
D DS
D ProductNo 16
D model 4 overlay(productNO:1)
D fabric 6 overlay(productno:*next)
D color 3 overlay(productno:*next)
D size 3 0 overlay(productno:*next)
注:Subfield的默认类型是S和A。还可以定义成P和B
数组和DS配合使用
DS和ARRAY配合使用,属于编程方面的小技巧,使用得当的话,会大大简化程序代码。
1 DS数组:
D ARR DS DIM(10) QUALIFIED
D SUB1 5A
D SUB2 5S 0
2 二维数组:
D ARR DS DIM(10) QUALIFIED
D SUBARR 10 0 DIM(20)
相当于定义了一个arr[10][20]的二维数组
使用方法:
C FOR i=1 to %elem(arr)
C FOR j=1 to %elem(subarr)
C eval sum += arr(i).subarr(j)
3 如果PF有一些连续的相同属性的字段,可以考虑把他们放到array中来处理,比如:
1)连续的字段位于文件的最开始:
A R REC
A FLD1 5P 0
A FLD2 5P 0
A FLD3 5P 0
A OTHER 10A
处理代码:
FMYFILE IF E DISK
D myDS E DS EXTNAME(MYFILE)
D fldArray LIKE(FLD1) DIM(3)
D OVERLAY(myDs)
C READ MYFILE
C FOR i = 1 to %ELEM(fldArray)
C* ... process fldArray(i)
C ENDFOR
2)连续的字段位于文件的中间:
A R REC
A OTHER1 10A
A FLD1 5P 0
A FLD2 5P 0
A FLD3 5P 0
A OTHER2 10A
FMYFILE IF E DISK
D myDS E DS EXTNAME(MYFILE)
D fldArray S LIKE(FLD1) DIM(3)
D BASED(pFldArray)
D pFldArray S * INZ(%addr(FLD1))
C READ MYFILE
C FOR i = 1 to %ELEM(fldArray)
C* ... process fldArray(i)
C ENDFOR
这种情况下,先定义一个指针,获取第一个重复字段的地址,相当于获取数组的首地址,也就相当于获取了这个数组。
3)如果PF中的字段有周期性重复的,比如:
A R REC
A FIELD 5P 0
A OTHER1 10A
A FLD1 5P 0
A OTHER2 10A
A FLD2 5P 0
A OTHER3 10A
A FLD3 5P 0
FMYFILE IF E DISK
D myDS E DS EXTNAME(MYFILE)
D fldArray DS DIM(3) BASED(pFldArray) QUALIFIED
D sub1 LIKE(OTHER1) OVERLAY(fldArray:1)
D sub2 LIKE(FLD1) OVERLAY(fldArray:*NEXT)
D pFldArray S * INZ(%addr(FLD1))
C READ MYFILE
C FOR i = 1 to %ELEM(fldArray)
C* ... process fldArray(i)
C ENDFOR
把重复出现的字段看成一个整体,来作为array的元素,然后再拆分。原文:http://bbs.chinaunix.net/viewthread.php?tid=3570429
-
Views(13575) | Comments(3) |
In:
AS400について
|


[RPG中数组和DS使用方法总结]的回复
-
Sutra 于 2011-08-30 12:53:42 发表 | IP:180.168.64.*
- RPG 不是角色扮演游戏么?
-
柠檬园主 2011-09-01 23:05:58 回复:
你说的那个RPG是后来者,这个比那个早多了
-
螺旋藻的功效与作用 于 2011-10-11 10:38:26 发表 | IP:111.127.232.*
- 虽然不太懂,但可以看出博主的用心。欢迎博主来我的博客做客:http://www.ewoka.net
-
CC霜 于 2011-11-08 23:56:43 发表 | IP:119.132.101.*
- 这是什么语言? 看标题我还以为是在说Java.
-
柠檬园主 2011-11-11 13:49:19 回复:
就是RPG,凡事不能看表面的 :D