2016-01-18 3 views
1

У меня есть 2-мерный массив в коболе, и я хочу написать каждую строку в выходной файл. Для этого я напишу следующий код.Индексирование таблицы в 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. 

Удивительно, но отчет составитель ошибка "FILE СТОЛ РЯД необходим один индекс" на WRITE FILE-TABLE-ROW (I) LINE. Я не понимаю, почему это ошибка.

+0

Как вы читаете файл? – gazzz0x2z

+0

@ gazzz0x2z open для организации записи является последовательным –

ответ

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 года стандарта, слово Наполнитель может быть написано невидимыми чернилами:

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

Заготовку во имя неявное ФИЛЛЕР. Отметим также, что 05 может быть записано как 5, так как каждый номер уровня, начинающийся с нуля.

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

Я не вижу FD, но предполагаю, что он есть. Поместите свой стол в РАБОЧЕЕ ХРАНЕНИЕ (или ЛОКАЛЬНОЕ ХРАНЕНИЕ). Определите 10-байтовую запись в вашем FD, MOVE FILE-TABLE-ROW для этой вновь определенной записи или используйте WRITE FROM FILE-TABLE-ROW.

Вы не можете записать часть записи (уровень 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 

Для первых, вы неполносимметричных определите свой поставьте под свой FD, поместите значения в нужные поля и затем НАПРАВЛЯЕТ запись.

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

Эти данные могут быть в любом месте раздела DATA DIVISION. Это может быть даже из где-то еще в разделе ФАЙЛА (запись записи WRITE FROM из входной записи - это то, что вы увидите).

FROM на WRITE, как INTO на READ, является неявным MOVE. MOVE formatted-data Для записи вывода и записи WRITE, это то, что говорит WRITE ... FROM ....

+0

Означает ли это, что когда я пишу файл, исходные переменные должны поступать из рабочего хранилища, а чтение требует назначения из раздела файла? –

+0

@lplouis - это яснее обновление? –

+0

Я не уверен, понимаю ли я, что «MOVE FILE-TABLE-ROW для этого» означает –

 Смежные вопросы

  • Нет связанных вопросов^_^