Двумерный массив переменной длины в Cobol - PullRequest
4 голосов
/ 25 января 2010

Как вы определите двумерный массив MxN в Cobol, переменные длины которого и M, и N?

Вот сообщение, которое я получаю в Net Express при попытке создать массив переменных внутри другого:

COBCH0144S OCCURS DEPENDING subsidiary to OCCURS only allowed with ODOSLIDE

Ответы [ 2 ]

6 голосов
/ 26 января 2010

То, что вы пытаетесь определить, представляет собой структуру «Сложность возникает в зависимости от» (сложный ODO).

Вы можете определить сложный ODO, где таблица представляет собой прямоугольник следующим образом:

01 TABLE-REC.<br> 05 M PIC S9(4) BINARY. 05 N PIC S9(4) BINARY. 05 ROWS OCCURS 10 TIMES DEPENDING ON M. 10 COLUMNS OCCURS 10 TIMES DEPENDING ON N. 20 CELL PIC X(1).

Хитрость заключается в том, что объявление N не может происходить в переменной части таблицы.Например, следующее объявление:

01 TABLE-REC. 05 M PIC S9(4) BINARY. 05 ROWS OCCURS 1 TO 10 TIMES DEPENDING ON M. 10 N PIC S9(4) BINARY 10 COLUMNS OCCURS 1 TO 10 TIMES DEPENDING ON N. 20 CELL PIC X(1).

приведет к ошибке, поскольку объявление подразумевает, что каждая строка может содержать различное количество столбцов (т. Е. Не прямоугольная таблица).

В общем, существует много недоразумений относительно того, что структура ODO в COBOL действительно «покупает» вас.Существует распространенное, но ошибочное мнение, что его можно использовать для экономии памяти, поскольку размер структуры данных может быть динамически изменен.Это абсолютно неверно, когда ODO объявлен в ЛОКАЛЬНОМ или РАБОЧЕМ ХРАНИЛИЩЕ.Компилятор COBOL выделит достаточно памяти для размещения наибольшего значения M и N.

То, что он «покупает», - это механизм для физической организации данных в памяти.Посмотрите на следующую программу и то, что она отображает:

IDENTIFICATION DIVISION. PROGRAM-ID. EXODO. DATA DIVISION. WORKING-STORAGE SECTION. 77 I PIC S9(4) BINARY. 77 J PIC S9(4) BINARY. 01 DIMENSIONS. 05 M PIC S9(4) BINARY VALUE 6. 05 N PIC S9(4) BINARY VALUE 7. 01 TABLE-REC-1. 05 ROWS OCCURS 1 TO 10 TIMES DEPENDING ON M. 10 COLUMNS OCCURS 1 TO 10 TIMES DEPENDING ON N. 20 CELL PIC X(1). 01 TABLE-REC-2. 05 ROWS OCCURS 10 TIMES. 10 COLUMNS OCCURS 10 TIMES. 20 CELL PIC X(1). PROCEDURE DIVISION. PERFORM VARYING I FROM 1 BY 1 UNTIL I > M PERFORM VARYING J FROM 1 BY 1 UNTIL J > N MOVE 'X' TO CELL OF TABLE-REC-1 (I J) MOVE 'X' TO CELL OF TABLE-REC-2 (I J) END-PERFORM END-PERFORM DISPLAY TABLE-REC-1 DISPLAY TABLE-REC-2 GOBACK .

Отображение: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX

Обратите внимание, что в версии ODO все данные красиво скомпонованы в 6Матрица X 7, в то время как версия с фиксированным столом сохраняет матрицу 10 X 10 с кучей «дырок» в ней, чтобы заполнить каждую строку до максимального числа OCCURS.Есть моменты, когда это различие важно (но чаще всего это не так).

Я вижу, что вы используете Net Express, с которым я не знаком, поэтому вам, возможно, придется возиться, чтобы получить следующую частьработать.С IBM Enterprise COBOL для Z / OS вы можете делать следующее:

Определить ODO в программе LINKAGE SECTION, чтобы не было выделено никакой памяти, это просто макет записи.Затем вы можете динамически выделить достаточно памяти для фактического размера таблицы, необходимой (т.е. M раз N элементов).Соедините их, используя что-то вроде: SET ADDRESS OF ODO-DATA-STRUCTURE TO mem-address (в CICS используйте GETMAIN, а в пакетном режиме используйте CEEGTST для получения памяти).Теперь у вас есть динамическая структура данных, которая использует минимальный объем пространства и все равно будет правильно индексировать из-за свойств макета, показанных выше.

Существуют другие способы использования (или не использования) ODO в COBOL, но онисамые распространенные из известных мне.

1 голос
/ 08 июня 2012

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

...