1

我在 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 需要一个下标”。我不明白为什么这是一个错误。

4

1 回答 1

2

首先,我看到您在最后一个问题之后已经使用 OCCURS 获得了合同表。我认为这是错误的做法。这个更好。

   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,每个以零开头的级别数也可以写为 。

正如那句老话所说,读文件,写记录。在这种情况下,“记录”是 DF 下的 01 级。您正在尝试编写一些作为记录的从属部分的内容,但这是行不通的。似乎混淆了编译器。

我没有看到 FD,但假设它在那里。将您的表放入 WORKING-STORAGE(或 LOCAL-STORAGE)。在您的 FD 下定义一个 10 字节的记录,将 FILE-TABLE-ROW 移动到该新定义的记录,或使用 WRITE FROM FILE-TABLE-ROW。

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

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

首先,您在 FD 下完全定义输出,将值放入您需要的字段中,然后写入记录。

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

该数据可以来自数据部门中的任何地方。它甚至可能来自 FILE SECTION 中的其他地方(您将看到从输入记录写入输出记录)。

FROMon WRITE 和 on READ 一样,INTO是一个隐含的MOVE. MOVE formatted-data TO output-record 和 WRITE output-record,就是这么WRITE ... FROM ...说的。

于 2016-01-18T08:14:35.490 回答