Перейти до вмісту
ГОСТ 22558-89
/ 116

Рассмотрим следующий пример.

PERFORM PARA3 VARYING X FROM 1 BY I UNTIL X IS GREATER THAN 3

AFTER Y FROM X BY 1 UNTIL Y IS GREATER THAN 3.

ВЫПОЛНИТЬ ПАРАЗ МЕНЯЯ X ОТ 1 НА 1 ДО X БОЛЬШЕ 3

ЗАТЕМ Y ОТ X НА 1 ДО Y БОЛЬШЕ 3.

По стандарту Кобола PARA3 (ПАРАЗ) будет выполняться 8 раз со следую­щими значениями.

X: 1 1 1 2 2 2 З 3

Y: 1 2 З 1 2 3 2 3

По правилам настоящего стандарта PARA3 (ПАРАЗ) будет выполняться 6 раз со следующими значениями.

X: 1 1 1 2 2 3

Y: 1 2 3 2 З 3

Можно ожидать, что выше приведенный пример выполняется так же, как и следующий пример:

PERFORM PARA2 VARYING X FROM 1 BY 1 UNTIL X IS GREATER THAN 3. PARA2.

PERFORM PARA3 VARYING Y FROM X BY 1 UNTIL Y IS GREATER THAN 3.

ВЫПОЛНИТЬ ПАРА2 МЕНЯЯ X ОТ 1 НА 1 ДО X БОЛЬШЕ 3.

ПАРА2

ВЫПОЛНИТЬ ПАРАЗ МЕНЯЯ Y ОТ X НА 1 ДО Y БОЛЬШЕ 3.

По ГОСТ 22558 PARA3 (ПАРАЗ) будет выполняться 8 раз, как показано выше. По правилам настоящего стандарта PARA3 (ПАРАЗ) будет выполняться 6 раз.

Это изменение повлияет на малое количество имеющихся программ. Ситуа­ция, когда одна переменная в варианте VARYING (МЕНЯЯ) зависит от другой переменной, удобна для обработки полуматриц вдоль главной диагонали; пра­вила в настоящем стандарте определяют эту функцию должным образом, в то время как правила ГОСТ 22558 не определяют ее.

Оператор PERFORM (ВЫПОЛНИТЬ) (2 ЯДР).

Определен порядок вычисления индексов в операторе PERFORM VARYING (ВЫПОЛНИТЬ МЕНЯЯ). Эта ситуация не определена в ГОСТ 22558.

Обоснование

По правилам настоящего стандарта Кобола индексы в операторе PERFORM VARYING (ВЫПОЛНИТЬ МЕНЯЯ) вычисляются следующим образом:

для идентификатора (индентификаторов) VARYING (МЕНЯЯ) индекси­рование выполняется каждый раз при установке или изменении идентификатора;

для идентификаторов FROM (ОТ) и BY (НА) индексирование выполняет­ся каждый раз, когда идентификатор используется в операциях установки или -приращения;

для любых идентификаторов, включенных в условие UNTIL (ДО), индек­сирование выполняется каждый раз при проверке условия.

ГОСТ 22558 не устанавливал, когда вычисляются индексы в цикле PERFORM (ВЫПОЛНИТЬ). Поэтому реализация была свободна в выборе, когда вычислять индексы. Изменение в настоящем стандарте приводит к несов­местимости только в случаях, если программа:

использует индексируемые идентификаторы в операторе PERFORM VARYING (ВЫПОЛНИТЬ МЕНЯЯ);

изменяет значение (значения) индекса (индексов) в то время, когда опе­ратор PERFORM (ВЫПОЛНИТЬ) активен, и

выполняется на реализации, которая осуществляет вычисление индексов, отличное от того, которое определяется в правилах настоящего стандарта.

Это изменение в стандарте Кобола является разрешением неоднозначности и поможет обеспечить переносимость программ. Это изменение повлияет на не­большое количество имеющихся программ.

Оператор READ (ЧИТАТЬ) (1 ПОД, 1 ОТД, 1 ИПД). Вариант INTO (В) не может быть указан:

(а) если не все записи, связанные с файлом, и данное, указанное в варианте INTO (В), являются групповыми данными или элементарными буквенно-цифро­выми данными, или (б) если не одно описание записи подчинено статье описания -файла.

Обоснование

В ГОСТ 22558 не определена семантика перемещения записи в идентифика­тор, указанный в варианте INTO (В) оператора READ (ЧИТАТЬ). Для файла с несколькими элементарными записями нет утверждения относительно того, име­ет ли место преобразование данных, либо выполняется групповая пересылка данных. Таким образом, в следующем примере:

FD FILEA... .

01. RECA PIC S9(l-8).

01 RECB РІС 9(9)V9(9).

01 RECC РІС X(18).

WORKING-STORAGE SECTION.

'01 A PIC S9(10)V9(8).

PROCEDURE DIVISION.

READ FILEA INTO A.

ОФ ФАЙЛА ....

01 ЗАПА III 39(18).

01 ЗАПБ Ш 9 (9) T9 (9).

01 ЗАПВ Ш X(18).

СЕКЦИЯ РАБОЧЕЙ-ПАМЯТИ.

01 А Ш 39(10)T9(8).

РАЗДЕЛ ПРОЦЕДУР.

ЧИТАТЬ ФАЙЛА В А.

■перемещение записи в А не определено в ГОСТ 22558. Поэтому разные реализа­ции могут выдавать разные результаты. Новые правила в настоящем стандарте исключают неоднозначность в ситуации, приведенной выше. Это изменение от­разится только на программах, выполняющих оператор READ INTO (ЧИТАТЬ В) для файлов, имеющих-в описании несколько элементарных записей, среди ко­торых имеется по крайней мере одна числовая запись.

Это изменение повлияет только на некоторые имеющиеся программы.

Оператор RECEIVE (ПОЛУЧИТЬ) (2 КОМ). Если размер сообщения .больше области, на которую ссылаются, сообщение заполняет эту область слева ,774

направо, начиная с самой левой литеры сообщения. Для передачи остатка сооб­щения в ту же область должны быть выполнены дальнейшие операторы1 RECEIVE (ПОЛУЧИТЬ) со ссылкой на ту же очередь, подочередь и т. д.

Обоснование

По ГОСТ 22558, если получена часть сообщения и используется последую­щий оператор RECEIVE (ПОЛУЧИТЬ), ссылающийся на меньшую структуру определенной очереди, реализация определяет, передается или ист оставшаяся часть сообщения.

В настоящем стандарте разъяснено, что последующие операторы RECEIVE’ (ПОЛУЧИТЬ), ссылающиеся на полностью определенную структуру очереди, должны быть выполнены для получения остатка сообщения.

Это изменение повлияет только на некоторые программы, если таковые име­ются.

Оператор RETURN (ВЕРНУТЬ) (1 СРТ). Вариант INTO (В) не может быть указан, если:

не все записи, связанные с файлом, и не все данные, указанные в вари­анте INTO (В), являются групповыми или элементарными буквенно-цифровыми- данными, или

не одно описание записи подчинено статье описания сортируемого-сли- ваемого файла.

Обоснование

В ГОСТ 22558 не определена семантика для перемещения записи в иденти­фикатор, указанный в варианте INTO (В) оператора RETURN (ВЕРНУТЬ). Для файла с несколькими элементарными записями нет утверждения относитель­но того, имеет ли место преобразование данных или выполняется групповая пе­ресылка данных.

SD FILEA....

01 RECA PIC S9(1‘8).

01 RECB PIC 9(9)V9(9).

01 RECC РІС X( 18).

WORKING-STORAGE SECTION.

01 A PIC S9(IO)V9(8).

PROCEDURE DIVISION.

RETURN FILEA INTO A.

ОС ФАЙЛА ....

01 ЗАГІА III 39(18).

01 ЗАПБ UI 9(9)T9(9).

01 ЗАПВ Ш Х(18).

СЕКЦИЯ РАБОЧЕЙ-ПАМЯТИ.

01 А Ш 39(10)Т9(8).

РАЗДЕЛ ПРОЦЕДУР.

ВЕРНУТЬ ФАЙЛА В А.

перемещение записи в А не определено в ГОСТ 22558, Поэтому разные реализа­ции могут выдавать разные результаты. Новые правила в настоящем стандарте Кобола устраняют неоднозначность приведенной выше ситуации. Это изменение* повлияет только на программы, выполняющие оператор RETURN INTO (ВЕР­НУТЬ В) для файла, содержащего несколько элементарных записей, включаю­щих хотя бы одну числовую запись.

Это изменение повлияет только на некоторые программы, если таковые име­ются.

Оператор STOP RUN (ОСТАНОВИТЬ РАБОТУ) (1 ЯДР). Оператор. STOP RUN (ОСТАНОВИТЬ РАБОТУ) закрывает все файлы.

Обоснование

В ГОСТ 22558 не определено состояние файлов, остающихся в режиме от­крытия при завершении работы. В некоторых случаях эта ситуация может при- . вести к ошибкам.

В настоящем стандарте Кобола оператор STOP RUN (ОСТАНОВИТЬ РА­БОТУ) закрывает все открытые файлы. Многие реализации уже это делают и только некоторых, если таковые имеются, программ коснется это изменение.

Оператор STOP RUN (ОСТАНОВИТЬ РАБОТУ) (1 ЯДР). Если еди­нице исполнения доступны сообщения, оператор STOP RUN (ОСТАНОВИТЬ РАБОТУ) побуждает систему управления сообщениями удалить из очереди лю­бое сообщение, частично полученное этой единицей исполнения.

Обоснование

В ГОСТ 22558 не определено, что происходит с частично полученным сооб­щением, если единица исполнения выполняет оператор STOP RUN (ОСТАНО­ВИТЬ РАБОТУ). Имеются три возможности, которые могли бы быть реализова­ны по стандарту Кобола:

система управления сообщениями делает частично полученные сообще­ния недоступными для любой последующей единицы исполнения посредством:

игнорирования этих сообщений, или

очистки очереди от них непосредственно или как части содержимого об­щей очереди. На программы, использующие эту реализацию, измененные специ­фикации не повлияют;

система управления сообщениями возвращает сообщение в целом, вклю­чая «полученную» часть входной очереди, для обработки некоторой последую­щей единицей исполнения. Вероятно, это удалось в предположении, что если про­грамма выполняет оператор STOP RUN (ОСТАНОВИТЬ РАБОТУ) без оконча­ния обработки входного сообщения, программа, возможно, потерпела неудачу (произошел сбой) и ее выполнение, возможно, будет возобновлено. На програм­мы, использующие этот тип реализации, измененные спецификации повлияли бы;

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

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

Оператор STRING (СОБРАТЬ) (2 ЯДР). Определен порядок вычис­ления индексов в операторе STRING (СОБРАТЬ).

Обоснование

В ГОСТ 22558 порядок вычисления индексов не определен, поэтому опреде­ляется реализацией. В частности, не определен относительный порядок вычисле­ния индексов и модификации указателя.

Рассмотрим следующий пример:

ОН. А РІС X(IOOO').

01 В РІС XXX.

01 cc

00 Cl РІС 9(4) OCCURS WO TIMES.

PROCEDURE DIVISION.

MOVE A TO PTR.

STRING A DELIMITED BY SPACE INTO В POINTER Cl (PTR).

01 А Ш X(1000).

01 Б Ш XXX.

0) ПТР ПЕРЕОПРЕДЕЛЯЕТ Б 111 999.

01.CC.

02 Cl Ш 9(4) ПОВТОРЯЕТСЯ 100 РАЗ.

РАЗДЕЛ ПРОЦЕДУР.

ПОМЕСТИТЬ 1 В ПТР.

СОБРАТЬ А ОГРАНИЧИВАЯСЬ ПРОБЕЛ В Б УКАЗАТЕЛЬ С1 (ПТР).

В ГОСТ 22558 не определено, вычисляется ли Cl (PTR) (С1 (ПТР)) (а) один раз, или (б) до или после запоминания в В (Б) при каждой итерации. Но-

вне правила в настоящем стандарте Кобола устанавливают, что Cl (PTR) (СІ (ПТР)) вычисляется один раз, непосредственно перед выполнением операто­ра STRING (СОВРАТЬ).

Это изменение влияет па программу, если идентификатор варианта INTO (В) оператора STRING (СОБРАТЬ) перекрывал индекс ограничителя или идентификатора в варианте WITH POINTER (УКАЗАТЕЛЬ). Такое программи­рование неудобно и это изменение повлияет на небольшое количество программ, если таковые имеются.

Оператор UNSTRING (РАЗОБРАТЬ) (2 ЯДР).

В операторе UNSTRING (РАЗОБРАТЬ) любое индексирование, связанное с идентификатором DELIMITED BY (ОГРАНИЧИВАЯСЬ), идентификатором INTO (В) идентификатором DELIMITER IN (ОГРАНИЧИТЕЛЬ В) или иден­тификатором COUNT IN (СЧЕТ В), определяется один раз, непосредственно перед просмотром пересылаемых полей в поисках ограничителя.

Обоснование

Рассмотрим следующий пример:

01 А РІС Х(30).

01 ВВ.

02 PTR РІС 99.

01 СС.

02 Cl РІС XX OCCURS 10 TIMES.

01 D РІС XX.

01 Е РІС Х(30).

PROCEDURE DIVISION.

UNSTRING A DELIMITED BY Cl (PTR) INTO ВВ, E WITH POINTER PTR.

01 А Ш X(30).

01 BB

02 ПТР Ш 99.

01 CC.

02 Cl Ш XX ПОВТОРЯЕТСЯ 10 РАЗ,

01 Д Ш XX.

01 Е Ш Х(30).

РАЗДЕЛ ПРОЦЕДУР.

РАЗОБРАТЬ А ОГРАНИЧИВАЯСЬ СІ (ПТР) В ВВ, Е УКАЗАТЕЛЬ ПТР.

Согласно правилам ГОСТ 22558 ограничитель Cl (PTR) (С1 (ПТР)) будет опять рассматриваться перед перемещением второй строки в Е, в то время как по новым правилам в настоящем стандарте Кобола Cl (PTR) (С1 (ПТР)) рас­сматривается только один раз перед просмотром пересылаемых полей. Таким образом, ограничители никогда не меняются во время всего процесса разбора.

Хотя по ГОСТ 22558 любое индексирование, связанное с ограничителем, вы­числяется непосредственно перед пересылкой данного в соответствующее данное, это приводит к ошибке, поскольку ограничитель должен быть определен до про­смотра пересылаемого поля, и поэтому не может вычисляться непосредственно перед пересылкой. Таким образом, это изменение в установленных правилах поз­воляет вычисление ограничителей в соответствующее время так, как это делают некоторые имеющиеся реализации при обработке оператора UNSTRING (РА­ЗОБРАТЬ).

Для того чтобы эти изменения повлияли на программу, идентификатор в ва­рианте INTO (В) оператора UNSTRING (РАЗОБРАТЬ) должен перекрывать индекс ограничителя. Такое программирование некорректно и это изменение от­разится только на немногих программах, если таковые имеются.

Оператор WRITE (ПИСАТЬ) (2 ПОД).

В одном и том же операторе WRITE (ПИСАТЬ) не могут быть одновремен­но определены фразы ADVANCING PAGE (ДО/ПОСЛЕ ПРОДВИЖЕНИЯ СТРАНИЦЫ) и END-OF-PAGE (В КОНЦЕ СТРАНИЦЫ).

Обоснование

В ГОСТ 22558 допускается указание обеих фраз в одном и том же операто­ре WRITE (ПИСАТЬ). Тем не менее нет правил, определяющих порядок их об­работки. Следовательно, обработка определяется реализацией.

Обе фразы ADVANCING PAGE (ДО/ПОСЛЕ ПРОДВИЖЕНИЯ СТРАНИ­ЦЫ) и END-OF-PAGE (В КОНЦЕ СТРАНИЦЫ) позволяют управлять верти­кальным позиционированием печатаемой страницы. Продвижение страницы сред­ствами фразы ADVANCING PAGE (ДО/ПОСЛЕ ПРОДВИЖЕНИЯ СТРАНИ­ЦЫ) осуществляется в соответствии с техникой, определяемой реализацией. В то же время продвижение страницы средствами фразы END-OF-PAGE (В КОН­ЦЕ СТРАНИЦЫ) является техникой, определяемой пользователем. Поэтому было решено разделить эти разные техники.

Хотя допускалось одновременное использование этих вариантов соответст­венно ГОСТ 22558, этим пользовались мало реализаций. Поэтому на имеющиеся программы это изменение повлияет в минимальной степени.

Указатель позиции файла (1 ПОД, 1 ОТД, 1 ИПД). Понятие указате­ля текущей записи в ГОСТ 22558 изменено на указатель позиции файла.

Обоснование

В настоящем стандарте Кобола правила, основанные на указателе позиции файла, усилены и облегчены для понимания. Кроме того, для сочетания обновле­ния и операторов READ NEXT (ЧИТАТЬ СЛЕДУЮЩУЮ) указатель текущей записи в ГОСТ 22558 сложен и не всегда приводил к интуитивно ожидаемому результату. Правила указателя текущей записи также недостаточно определены в отдельных случаях, когда указываемая запись становится недоступной.

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

Указатель позиции файла (2 ОТН, 2 ИПД). Для относительного или индексного файла при динамическом доступе выполнение оператора OPEN 1-0 (ОТКРЫТЬ ВХОДНОЙ-ВЫХОДНОЙ), за которым следуют один или более операторов WRITE (ПИСАТЬ) с последующим оператором READ NEXT (ЧИ­ТАТЬ СЛЕДУЮЩУЮ), приведет к тому, что оператору READ (ЧИТАТЬ) бу­дет доступна первая запись в файле во время выполнения оператора READ (ЧИТАТЬ).

Обоснование

В ГОСТ 22558 эта последовательность приводит к тому, что оператору READ (ЧИТАТЬ) доступна первая запись во время выполнения оператора OPEN (ОТ­КРЫТЬ). Если один из операторов WRITE (ПИСАТЬ) вставляет запись с клю­чом или относительным номером записи ниже, чем любые записи, имеющиеся в файле, оператору READ (ЧИТАТЬ) была бы доступна запись, отличная от пер­вой.

Считается более логичным, чтобы при выполнении первого оператора READ NEXT (ЧИТАТЬ СЛЕДУЮЩУЮ) после оператора OPEN (ОТКРЫТЬ) доступ­ной записью была бы первая запись в файле во время выполнения оператора READ (ЧИТАТЬ).

Семантика в настоящем стандарте ставит на один уровень ситуацию, возни­кающую после оператора OPEN (ОТКРЫТЬ), и ситуацию, возникающую после оператора READ (ЧИТАТЬ). В последнем случае, если оператор WRITE (ПИ­САТЬ) вставляет запись с ключом таким, что она следует непосредственно за последней прочитанной записью, следующий оператор READ NEXT (ЧИТАТЬ СЛЕДУЮЩУЮ) получит вставленную запись.

Побачили розбіжність з офіційним текстом?

Повідомити про неточність

Напишіть, що саме розходиться з офіційною публікацією. Код документа вкажіть у повідомленні — так ми швидше знайдемо потрібне місце.

Перейти до форми зворотного зв'язку

Дивіться також

Весь розділ →