2014-05-10 1 views
0

Прежде всего, позвольте мне поблагодарить вас за то, что вы не торопитесь, чтобы взглянуть на мой вопрос. Я изучаю COBOL и я давал упражнения, где я должен создать переменную, которая имеет ряд городов из страны, я знаю, как создать это с иерархией вещи, как:Создайте переменную, где я могу ссылаться на ее значения по их позиции COBOL

01 COUNTRY. 
02 CITY-A PIC A(5) VALUE "TOKYO". 
02 
02 

и т. д. и т. д.

Проблема в том, что мне почему-то нужны эти значения, чтобы иметь возможность ссылаться на их позицию. Например, я должен иметь возможность ссылаться на CITY-A «TOKYO» числом. Есть какой-либо способ сделать это? Я просто не могу понять это. Любая помощь будет принята с благодарностью. Еще раз спасибо!

+1

доброта, это возвращает меня, я предлагаю вам взглянуть на предложение «происходит», которое используется для объявления «массивов». Это может быть полезно: [2010/01/table-handling.html] (http://www.mainframes360.com/2010/01/table-handling.html) –

+0

эй Райан, похоже, именно то, что я искал потому что, я дам ему попробовать, спасибо вам большое! – user3624270

+2

Чем больше я читаю эту статью в ссылке, тем меньше мне это нравится. Как правило, вы получите точку оттуда, но есть много ошибок и недоразумений. –

ответ

4

Вам необходимо определить таблицу городов. Продолжая в стиле, который вы показали, вот пример с предложениями VALUE.

01 CITY-TABLE. 
    05 FILLER PIC X(30) VALUE "TOKYO". 
    05 FILLER PIC X(30) VALUE "KYOTO". 
    05 FILLER PIC X(30) VALUE "AIZUWAKMATSU". 
    ... another 47 of these 

Обратите внимание, что все предметы должны иметь одинаковую длину. «TOKYO» - пять символов плюс 25 конечных пробелов. «AIZUWAKMATSU» - это больше символов и меньше конечных пробелов, но еще 30 байт. Если вы определяете свои города с полями различной длины, вы не сможете ссылаться на них «числом».

Затем вам необходимо использовать REDEFINES, чтобы дать другое сопоставление данных, в этом случае дать ему имя, которое может использоваться для разных вхождений в таблице.

01 FILLER REDEFINES CITY-TABLE. 
    05 CITY-NAME PIC X(30) OCCURS 50 TIMES. 

С вашей структурой данных, определенной, вы можете попробовать ее использовать.

MOVE "TOKYO" TO CITY-NAME 

Собственно, вы не можете этого сделать. Компилятор не позволит вам. Есть 50 элементов CITY-NAME, и компилятор требует, чтобы вы сказали, какой из них вы хотите использовать, всякий раз, когда вы используете CITY-NAME.

Чтобы получить доступ к элементу в таблице, вам нужно использовать индекс.

Подзаголовок следует за его именем-именем (при необходимости «квалифицированным») и заключен в скобки/круглые скобки.

MOVE "TOKYO" TO CITY-NAME (1) 

Теперь это скомпилируется. Он использует числовой целочисленный литерал в качестве индекса. Не полезно в каждом случае, так как часто мы будем «зацикливаться» на использовании таблицы.

MOVE "TOKYO" TO CITY-NAME (some-name) 

Здесь some-name могут представлять собой данные, определенный программист (как числовое целое число), или как «индекс», числовое целое число, которое компилятор будет управлять.

Чтобы установить «индекс», вы укажете INDEXED с помощью некоторого имени в элементе, содержащем предложение OCCURS.

Если вы используете имя-имя в качестве индекса, это всего лишь имя-имя, и вы в значительной степени неограниченны с Глаголами COBOL, которые вы можете использовать с ним.

Если вы используете индексное имя (INDEXED BY), вы можете изменить значение имени индекса только с помощью SET, PERFORM и SEARCH.

PERFORM VARYING some-name FROM 1 BY 1 
    UNTIL input-byte (some-name) EQUAL TO SPACE 
     OR some-name GREATER THAN 10 
    ... 
END-PERFORM 

Это не такая хорошая петля, но это та вещь, которая поможет вам начать.

После завершения, некоторое имя будет либо 11 (пробел не найден), либо будет установлено значение таблицы, которое соответствует первому пространству в данных.

В приведенном выше PERFORM некоторое имя может быть либо именем индекса, либо именем данных. Результаты будут одинаковыми, то, что генерирует компилятор, будет отличаться.

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

У вас могут быть многомерные таблицы. Вы можете «компенсировать» нижний индекс положительной или отрицательной суммой. В случае производительности есть иерархия использования индексов. Существует много понимания, прежде чем вы сможете точно использовать «одно быстрее, чем другое» (вы можете легко закодировать быстрый доступ, а затем потерять гораздо больше, чем вы спасите, сделав петлю глупостью). Также имеется элемент данных индекса.

Все эти вещи могут быть позже. Сначала поймите хорошо.

Заключительная путаница (есть много путаниц с подписью), есть ссылка-модификация. Это похоже на использование индекса, но его нет, но его можно использовать как извилистый (с точки зрения более позднего понимания) метод доступа к текстовой таблице.

MOVE "TOKYO" CITY-TABLE (1 : 30) 

Обратите внимание, что используется имя таблицы, а не имя входа. Двоеточие (:) говорит, что это ссылка-модификация. Прежде чем двоеточие будет начальным, после двоеточия будет длина. И начальная позиция, и длина могут быть именами данных (но не именами индексов).

Однако

MOVE CITY-TABLE (VAR1 : 10) 

Типичная неаккуратно использование эталонного-модификации, оставляет читателя интересно, что делается с этими данными.

Подстрочный элемент может быть модифицирован по ссылке, но опять же, что и для более позднего.

+0

Очень хороший и полный ответ. На самом деле гораздо лучше, чем ссылка на статью, приведенная в комментариях к этому вопросу. – NealB

+0

@NealB спасибо. Если ссылка была хорошей, нет необходимости в ответе. Я должен поговорить с автором об этом, когда вспомню. Он очень увлечен, но не всегда основателен. Спасибо за редактирование. –