Table 在 cobol 中建立索引

Table indexing in cobol

我在 cobol 中有一个二维数组,我想将每一行写入输出文件。我编写了以下代码来执行此操作。

FILE-SECTION.
01 FILE-TABLE.
   05 FILE-TABLE-ROW OCCURS 10 TIMES INDEXED BY I.
      10 FILE-TABLE-COL PIC X(1) OCCURS 10 TIMES INDEXED BY J.

SET I TO 1.
PAR-A.
IF I <= 10 THEN
   WRITE FILE-TABLE-ROW(I)
   SET I UP BY 1
   GO TO PAR-A
END-IF.

令人惊讶的是,编译器在WRITE FILE-TABLE-ROW(I) LINE报错"FILE-TABLE-ROW needs one subscript"。我不明白为什么这是一个错误。

首先,我看到您在上一个问题后已经与 OCCURS 签约 table。我认为这是错误的做法。这样比较好。

   01  FILE-TABLE.
      05  FILE-TABLE-ROW 
          OCCURS 10 TIMES 
          INDEXED BY I.
          10  FILE-TABLE-COL 
              OCCURS 10 TIMES 
              INDEXED BY J.
              15  FILE-TABLE-COL           PIC X(1).

只是我之前没有提到的一点,因为您可能正在命名以帮助您作为初学者,如果您不打算使用它们,则不需要命名字段。

   01  FILE-TABLE.
      05  FILE-TABLE-ROW 
          OCCURS 10 TIMES 
          INDEXED BY I.
          10  FILLER 
              OCCURS 10 TIMES 
              INDEXED BY J.
              15  FILE-TABLE-COL           PIC X(1).

请注意,自 1985 年标准以来,FILLER 一词可以用隐形墨水书写:

    05  FILLER                             PIC X(20).
    05                                     PIC X(20).

名称中的空白是隐含的 FILLER。另请注意,05 可以写成 5,每个以零开头的 level-number 也可以。

俗话说,读文件,写记录。 "Record" 在此上下文中是 DF 下的 01 级。您正试图写一些作为记录的从属部分的东西,这是行不通的。似乎混淆了编译器。

我没有看到 FD,但假设它在那里。将您的 table 放入 WORKING-STORAGE(或 LOCAL-STORAGE)。在你的 FD 下定义一个 10 字节的记录,MOVE FILE-TABLE-ROW 到那个 newly-defined 记录,或者使用 WRITE FROM FILE-TABLE-ROW.

您不能在 FILE SECTION 中写入部分记录(01 级)。您可以使用 MOVE 或 WRITE ... FROM ... 访问非 01 级别的数据,并将该数据放入您的 01 级别以允许 WRITE。

WORKING-STORAGE SECTION,
01  some-thing PIC X.

然后

MOVE some-thing TO output-record
WRITE output-record

WRITE output-record FROM some-thing

这里有两种不同的写法 WRITE 您感兴趣的是:

WRITE record-name
WRITE record-name FROM somewhere-else

首先,您fully-define在您的FD下输出,在您需要的字段中输入值,然后WRITE记录。

对于第二个,你只需要在 FD 下定义一个最小的定义(足以定义记录的长度,它可以是可变的,稍后你可能会遇到)并且你将值放在所有字段中您需要,如有必要,从属于另一个组项目。 FD下的定义可以是完整的,只是不一定是。

该数据可以来自数据部门的任何地方。它甚至可能来自 FILE SECTION 中的其他地方(您将看到 WRITE output-record FROM input-record)。

WRITE 上的 FROM 与 READ 上的 INTO 一样,是隐含的 MOVE。将 formatted-data 移动到 output-record 并写入 output-record,这就是 WRITE ... FROM ... 所说的。