Colorful Life2010

RPG中数组和DS使用方法总结

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

历史上的今天: [2005/08/30]数据库游标详解

[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

Post a Comment~