免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8589 | 回复: 8

数组和DS使用方法总结 [复制链接]

论坛徽章:
0
发表于 2011-07-22 15:35 |显示全部楼层
既然是总结性的东东,就不写的太详细了。细节和简单的东东就不提了。

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的元素,然后再拆分。

论坛徽章:
0
发表于 2011-07-22 22:59 |显示全部楼层
只用过一点点的东西

论坛徽章:
0
发表于 2011-07-25 08:54 |显示全部楼层
没总结之前,总觉得数组和DS的用法零零碎碎,好像有很多的东东要掌握
现在发现,不过如此

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-11-05 06:20:00
发表于 2011-07-25 21:06 |显示全部楼层
顶起啊~~学习了 啊

论坛徽章:
0
发表于 2011-07-26 15:45 |显示全部楼层
为什么不用临时表,非要在RPG中写个array , 整个麻烦, 一般在使用系统提供的用户名,机器名,打印行数溢出等判断时才会用array .

如果想在两个程序间通信也要用queue 或 data area 才对哦.

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-11-05 06:20:00
发表于 2011-07-26 18:04 |显示全部楼层
什么和什么啊?

论坛徽章:
0
发表于 2011-07-26 21:51 |显示全部楼层
为什么不用临时表,非要在RPG中写个array , 整个麻烦, 一般在使用系统提供的用户名,机器名,打印行数溢出等判 ...
notthought 发表于 2011-07-26 15:45



    临时表要有SRC才能生成吧
而且对FILE的操作和对ARRAY的操作速度差很多

用户名,机器名那些也是一方面的用途

论坛徽章:
0
发表于 2011-07-27 08:30 |显示全部楼层
回复 5# notthought


    ARRAY是任何语言都支持的一种数据结构,RPG中存在肯定也有他的道理,有的情况下用array会非常方便简洁

    至于用临时表还是array,我到觉得array可能会更简单一些哦。

论坛徽章:
0
发表于 2013-01-05 11:13 |显示全部楼层
niuhua77 发表于 2011-07-22 15:35
既然是总结性的东东,就不写的太详细了。细节和简单的东东就不提了。

ARRAY
..................
在程序的末尾要有** CTDATA 。建议使用** CTDATA array_name的方式,但是要注意array_name要与D-spec 定义的array_name要一致;仅用   **CTDATA(不指定array_name)时要注意** CTDATA的数据按照D-spec定义的array的顺序进行匹配。并且两者不能混着用。


这里有误导之嫌,以下是原文:
Array data may be specified in one of two ways:
1. **CTDATA arrayname: The data for the array may be specified anywhere in the compile-time data section.
2. **b: (b=blank) The data for the arrays must be specified in the same order in which they are specified in the Definition specifications.
Only one of these techniques may be used in one program.

显然该匹配的应是 **BLANK的方式而非**CTDATA
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP