Соответственно правилу, гласящему: «Исключение составляют только име- на-файлов, относящиеся к фразе GIVING (ПОЛУЧАЯ)», стандартный алгоритм слияния требует доступность в одно и то же время одной записи из каждого сливаемого файла. Поскольку оператор MERGE (СЛИТЬ) определен в терминах ввода-вывода стандарта Кобола, сливаемые файлы не могли использовать одну и ту же область записи. Единственный способ, чтобы в ГОСТ 22558 оператор MERGE (СЛИТЬ) мог работать соответствующим образом — это игнорирование фразы SAME RECORD AREA (ОБЩАЯ ОБЛАСТЬ ЗАПИСИ).
Это новое правило добавляет синтаксические ограничения в случаях, вызывающих затруднения. Следовательно, такие ситуации, возможно, имеют место в немногих имеющихся программах.
Оператор PERFORM (ВЫПОЛНИТЬ) (2 ЯДР). Определен порядок инициации (установки начального значения) идентификаторов в нескольких вариантах VARYING (МЕНЯЯ) оператора PERFORM (ВЫПОЛНИТЬ).
Обоснование
Порядок установки начального значения идентификаторов в нескольких вариантах VARYING (МЕНЯЯ) в ГОСТ 22558 не определен. В ГОСТ 22558 общее правило 6 г оператора PERFORM (ВЫПОЛНИТЬ) в частности гласит: «когда изменяются два идентификатора, идентификатор-2 и идентификатор-5 устанавливаются...». Правило настоящего стандарта гласит: «... идентификатор-2 затем идентификатор-5 устанавливаются ...», определяя таким образом порядок установки начального значения.
В случае, когда установка одного идентификатора определяет значение другого, и реализация обеспечивает установку идентификатора-5 первой, может возникнуть несовместимость. Например:
MOVE 2 ТО X.
PERFORM PARA1 VARYING X FROM 1 BY 1 UNTIL X=3
AFTER Y FROM X BY 1 UNTIL Y=3.
ПОМЕСТИТЬ 2 В X.
ВЫПОЛНИТЬ ПАРА) МЕНЯЯ X ОТ I НА 1 ДО Х=3
ЗАТЕМ Y ОТ X НА 1 ДО Y=3.
Если сначала устанавливается Y, оно будет установлено в 2; если первым устанавливается X, Y будет установлено в 1. По правилам настоящего стандарта сначала устанавливается X, поэтому Y будет установлено в 1.
Это изменение разрешает неоднозначность и поможет обеспечить переносимость программ. Вероятность несовместимости мала: реализация должна устанавливать первым идентификатор-5, что возможно, но маловероятно, и одна переменная варианта VARYING (МЕНЯЯ) должна зависеть от другой.
Оператор PERFORM (ВЫПОЛНИТЬ) (2 ЯДР).
В варианте VARYING ... AFTER (МЕНЯЯ ... ЗАТЕМ) оператора PERFORM (ВЫПОЛНИТЬ) идентификатор-2 увеличивается до установки идентификатора-5. В ГОСТ 22558 идентификатор-5 устанавливался до увеличения идентификатор а-2.
Обоснование
В ГОСТ 22558 общее правило н устанавливает, что при изменении двух переменных в промежуточном состоянии, когда внутреннее условие истинно, внутренняя переменная (идентификатор-5) устанавливается в ее текущее значение FROM (ОТ) до того, как увеличится внешняя переменная его текущим значением BY (НА).
По правилу настоящего стандарта идентификатор-2 увеличивается до установки идентификатора-5..
При этом изменении возникает несовместимость, если имеется зависимость между идентификатором-2 и идентификатором-5.
Рассмотрим следующий пример.
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 РАЗ,