Chinaunix首页 | 论坛 | 博客
  • 博客访问: 47945
  • 博文数量: 10
  • 博客积分: 557
  • 博客等级: 下士
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-25 20:13
文章分类

全部博文(10)

文章存档

2011年(9)

2010年(1)

分类:

2011-07-22 14:56:52

ARRAY

arraytable的区别

       Array:可以使用下标,进行顺序访问或随即访问

       Table:不可以使用下标,只能顺序访问。只能以TABxxx开头。

注:table虽然和array的功能相似,但是array要比table灵活很多。Table可以淘汰了,了解table的原因是维护老的代码时可能会用到。以后就不说table了。

 

array的类型和key word

       1有三种类型的array,分别是compile time arrayrun time arraypre-run time array

      

2array相关的key word

       DIMnumber       定义数组中元素的数量

       ASCEND/DESCEND   元素在数组中升序/降序排序

       PERRCDnumber   对于compile time array每一行中元素的个数

       CTDATA                      定义compile time array

       FROMFILE/TOFILE    pre-run time array

       EXTFMT            

举例:

       //array1定义10个元素,每个长度为5

       D Array1            S                5 0 DIM10

       //array2compile 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 Indexindex不能为0或负数,不能大于元素个数。

 

array相关的%BIF

      

1 %Xfoot 数组求和

       Sum = %Xfootarray_name

 

       2 %LookUpxx 查找(%TLookUpxx for table

 

        Index = %LookUpXXargumentarray{:satrtindex}

        %LookUp         查找第一个=argument元素的index

        %LookUpLE       查找第一个<=argument的元素index

        %LookUpLT       查找第一个的元素的index

        %LookUpGE      查找第一个>=argument的元素的index

        %LookUpGT      查找第一个>argument的元素的index

注:除了%LookUp外,使用其他的%LookUpxx的数组必须是排过序的。

 

       3 %Size 返回变量或常量所占的字节数

       Size = %Sizename{*all}

       D SmallFiled          S               5P 2

       D MyArray           S                5   DIM(%Size(Smallfield))

 

       SizeSmall = %Size(SmallField)        //SizeSmall = 3

       ArraySize = %SizeMyArray       //ArraySize = 5      单个元素的size

       Arraysize = %SizeMyarray*all   //Arraysize = 150    所有元素的size

 

       4 %Elem 返回数组中元素的个数

       Number = %Elemarray_name

      

 

Data Structure

 

DSkey word

       OCCURSnumber                定义DS数组

       OVERLAYname:{pos}           DS中重定义sub-filed

       PREFIXprefix                  为外部的字段增加前缀。

       EXTNAMEname:{fmt_name}     参照的外部文件格式,文件不需要在F-spec定义

       EXTFLDfield_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的默认类型是SA。还可以定义成PB

 

数  数组和DS配合使用

 

DSARRAY配合使用,属于编程方面的小技巧,使用得当的话,会大大简化程序代码。

      

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)

 

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

      

阅读(1629) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~