精通cobol--9.11.4 索引表的内部存储结构

索引表的内部存储结构相对于下标表而言要相对复杂一些。在下标表中,数据的存储位置即下标的数值。而在索引表,数据的存储位置和索引数值往往并不一致,需要计算得到。

对于索引表而言,其中的索引保存的是数据偏移量,而并不是数据实际存储位置。数据的实际存储位置,通过将索引变量除以每个数据的大小得到。

下面以一个公司一周内的营业额为基本模型,讨论索引表的内部存储结构。首先,对该表进行定义及初始化,代码如下。

01   WEEK-SALES-DATA.

     05  FILLER     PIC 9(5)    VALUE  ‘15874’.

     05              PIC 9(5)    VALUE  ‘10876’.

05              PIC 9(5)    VALUE  ‘14586’.

05              PIC 9(5)    VALUE  ‘13587’.

05              PIC 9(5)    VALUE  ‘19784’.

05              PIC 9(5)    VALUE  ‘10030’.

05              PIC 9(5)    VALUE  ‘10088’.

01    WEEK-SALES-TABLE  REDEFINES  WEEK-SALES-DATA.

      05    SALES        PIC  9(5)

                          OCCURS   7  TIMES

                          INDEXED BY  SALE-NDX.

为方便讨论,这里没有定义数据编号,只包含一周内每天的营业额SALES这一个数据条目。以上代码实际上也是定义一个最小化索引表的代码。

假设这里要引用周五的营业额数据,则代码如下。

SET  5   TO   SALE-NDX.

MOVE  SALES  (SALE-NDX)   TO  RESULT-DATA.

这里,通过使用SET语句,将5赋值给SALE-NDX,以引用周五的营业额数据。但是,在内部存储结构里,SALE-NDX实际存储的并不是数字5,而是第5项数据的偏移量。

关于数据偏移量,也就是该数据相对于索引表中第一条数据的偏移位置量。简单的说,一个数据的偏移量就是该数据和索引表中第一条数据之间有多少个存储单元。以上周营业额索引表中索引的内部存储结构如表9.12所示。

周营业额中的索引内部存储结构

实际对应的时间

营业额数据

SALES

索引变量SALE-NDX

周一

15874

0

周二

10876

5

周三

14586

10

周四

13587

15

周五

19784

20

周六

10030

25

周日

10088

30

通过上表可以看到,对应周五数据的索引变量实际上并不是5,而是20。这是因为,根据以下定义语句。

      05    SALES        PIC  9(5)

该表中每项数据都占用5个单位的存储单元。因此,第5条数据相对于第1条数据的偏移量为20

这里不妨假设一张索引表中每条数据占用x个存储单元。则第n条数据相应的索引在内部存储中的数值(即该数据的偏移量),可依据以下公式计算得到。

n条数据的偏移量=(n1* x

当然,对于上例而言,虽然通过以下语句将SALE-NDX实际的值置为了(51*520

SET  5   TO   SALE-NDX.

但在程序中,SALE-NDX的值仍然以数字5的形式出现。也就是说,程序员在编码中只需将其看作数值5来进行处理(虽然其实际数值为20)。程序中的数值5和实际内存中的偏移量20是由COBOL系统本身进行转换的。

你可能感兴趣的:(存储,cobol)