Индексация таблиц в коболе

У меня есть двумерный массив в коболе, и я хочу записать каждую строку в выходной файл. Я пишу следующий код, чтобы сделать это.

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.

Удивительно, но компилятор сообщает об ошибке «ФАЙЛ-ТАБЛИЦА-СТРОКА нуждается в одном индексе» в ЛИНИИ ЗАПИСЬ ФАЙЛ-ТАБЛИЦА-СТРОКА(I). Я не понимаю, почему это ошибка.


person Louis Kuang    schedule 18.01.2016    source источник
comment
Как вы читаете файл?   -  person gazzz0x2z    schedule 18.01.2016
comment
@gazzz0x2z открытая для записи организация является последовательной   -  person Louis Kuang    schedule 18.01.2016


Ответы (1)


Во-первых, я вижу, что после вашего последнего вопроса вы перешли к контрактной таблице с 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 года, слово НАПОЛНИТЕЛЬ можно писать невидимыми чернилами:

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

Пробел в имени — это неявный FILLER. Обратите также внимание, что 05 можно записать как 5, как и любой номер уровня, начинающийся с нуля.

ПРОЧИТАЙТЕ ФАЙЛ, ЗАПИСЫВАЙТЕ ЗАПИСЬ, как гласит старая поговорка. «Запись» в этом контексте — это уровень 01 ниже DF. Вы пытаетесь написать что-то, что является второстепенной частью записи, что не сработает. Кажется, перепутал компилятор.

Я не вижу FD, но предполагаю, что он есть. Поместите свою таблицу в WORKING-STORAGE (или LOCAL-STORAGE). Определите 10-байтовую запись под вашим FD, MOVE FILE-TABLE-ROW в эту вновь определенную запись или используйте WRITE FROM FILE-TABLE-ROW.

Вы не можете записать часть записи (уровень 01) в РАЗДЕЛ ФАЙЛА. Вы можете использовать MOVE или WRITE... FROM... для доступа к данным на уровне, отличном от 01, и получить эти данные на уровне 01, чтобы разрешить запись.

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

потом

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

Or

WRITE output-record FROM some-thing

Есть два разных способа написать WRITE, которые вас здесь интересуют:

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

Во-первых, вы полностью определяете свой вывод под своим FD, вводите значения в нужные вам поля, а затем ЗАПИСЫВАЕТЕ запись.

Для второго вам нужно только минимальное определение под ФД (достаточно определить длину записи, которая может быть переменной, вы, вероятно, придете к этому позже) и вы проставляете значения во всех нужных вам полях, подчиненных другой элемент группы, если это необходимо. Определение под ФД может быть полным, просто оно не обязательно.

Эти данные могут быть откуда угодно в DATA DIVISION. Это может быть даже где-то еще в РАЗДЕЛЕ ФАЙЛОВ (вы увидите запись WRITE output-record FROM input-record).

FROM при WRITE, как и INTO при READ, является неявным MOVE. MOVE formatted-data TO output-record и WRITE output-record, вот что говорит WRITE ... FROM ....

person Bill Woodger    schedule 18.01.2016
comment
Означает ли это, что когда я пишу файл, исходные переменные должны поступать из рабочего хранилища, а для чтения требуется, чтобы место назначения исходило из раздела файла? - person Louis Kuang; 18.01.2016
comment
Я не уверен, понимаю ли я, что 'MOVE FILE-TABLE-ROW to this' означает - person Louis Kuang; 18.01.2016
comment
Правильно, решите проблему! Спасибо! - person Louis Kuang; 18.01.2016