Это работает, как задокументировано.Я знаю, что это не то, что вы хотели услышать, но иногда это просто так.Ваше приложение ожидает завершения, поскольку параметр компиляции NUMCHECK обнаружил то, что он видит как недопустимые данные.
Обратите внимание, что параметр установки NUMCLS для IBM COBOL 6.2 определяет поведение теста класса IF NUMERIC,неявная версия которой генерируется опцией компиляции NUMCHECK.Если ваши упакованные данные определены без знака, т. Е.
77 XYZ PIC 999 COMP-3.
, то в документации указывается, что полубайт знака x'F '- это единственный полубайт знака, который пройдет тест класса IF NUMERIC.Любое другое значение для знака nibble считается недействительным.
Формулировка документации для опции NUMCLS для IBM COBOL 4.2 определенно отличается.
Возможно, вы захотитепроверьте по http://www -01.ibm.com / support / docview.wss? uid = swg27041164 # 112918 , чтобы узнать, применимы ли какие-либо из PTF к вашей ситуации.
Вы можете попытаться поднять проблему с IBM, но вот проблема: если у вас есть неподписанные данные, то можно привести аргумент, который имеет знак «клев», указывающий положительный (x'C ') или отрицательный (x'D ') знак недействителен.Я подозреваю, что это одна из причин того, что опция NUMCHECK работает так, как она работает.
Возможные решения включают в себя то, чтобы ваши программы на Ассемблере вызывали ваши программы на COBOL для исправления любых упакованных данных, которые они передают.Возможно OI на последнем байте.Возможно, вы сможете написать контрольные карты для утилиты SORT вашего магазина, чтобы зафиксировать упакованные данные в ваших плоских файлах.Вы можете изменить свои неподписанные элементы упакованных данных в ваших программах на COBOL, чтобы они были подписаны.
Все зависит от того, какое поведение вы желаете.Вы говорите, что не можете доверять содержимому ваших числовых переменных.Если это означает, что у вас иногда есть положительный знак x'A 'вместо x'C' для положительного значения, вы можете использовать NUMPROC (NOPFD), если действует NUMCLS (ALT).
Другое возможное решениев вашей ситуации, если действует NUMCLS (ALT), это скомпилировать с NUMPROC (NOPFD) и использовать подписанные поля для первоначального хранения ваших данных.Согласно документации, перемещение данных в поле без знака приведет к исправлению знака.Обратите внимание, что NUMPROC (NOPFD) не работает так же хорошо, как NUMPROC (PFD).
Ниже приведено расширение моего понимания документации, в которой признак отрывков знака приводит к истинности теста IF NUMERIC.У меня нет возможности проверить это, это просто моя попытка перевести неявный язык документации в явную таблицу.В нем подчеркиваются различия между IBM Enterprise COBOL 4.x и IBM Enterprise COBOL v5 и более поздними версиями.
SIGN COBOL 5+ COBOL 4
NUMCLS NUMPROC SIGNED NIBBLE NUMERIC NUMERIC
ALT NOPFD YES X'A' TRUE TRUE
ALT NOPFD YES X'B' TRUE TRUE
ALT NOPFD YES X'C' TRUE TRUE
ALT NOPFD YES X'D' TRUE TRUE
ALT NOPFD YES X'E' TRUE TRUE
ALT NOPFD YES X'F' TRUE TRUE
ALT NOPFD NO X'A' FALSE TRUE
ALT NOPFD NO X'B' FALSE TRUE
ALT NOPFD NO X'C' FALSE TRUE
ALT NOPFD NO X'D' FALSE TRUE
ALT NOPFD NO X'E' FALSE TRUE
ALT NOPFD NO X'F' TRUE TRUE
ALT PFD YES X'A' FALSE FALSE
ALT PFD YES X'B' FALSE FALSE
ALT PFD YES X'C' TRUE TRUE
ALT PFD YES X'D' TRUE TRUE
ALT PFD YES X'E' FALSE FALSE
ALT PFD YES X'F' FALSE FALSE
ALT PFD NO X'A' FALSE FALSE
ALT PFD NO X'B' FALSE FALSE
ALT PFD NO X'C' FALSE FALSE
ALT PFD NO X'D' FALSE FALSE
ALT PFD NO X'E' FALSE FALSE
ALT PFD NO X'F' TRUE TRUE
PRIM NOPFD YES X'A' FALSE FALSE
PRIM NOPFD YES X'B' FALSE FALSE
PRIM NOPFD YES X'C' TRUE TRUE
PRIM NOPFD YES X'D' TRUE TRUE
PRIM NOPFD YES X'E' FALSE FALSE
PRIM NOPFD YES X'F' TRUE TRUE
PRIM NOPFD NO X'A' FALSE FALSE
PRIM NOPFD NO X'B' FALSE FALSE
PRIM NOPFD NO X'C' FALSE TRUE
PRIM NOPFD NO X'D' FALSE TRUE
PRIM NOPFD NO X'E' FALSE FALSE
PRIM NOPFD NO X'F' TRUE TRUE
PRIM PFD YES X'A' FALSE FALSE
PRIM PFD YES X'B' FALSE FALSE
PRIM PFD YES X'C' TRUE TRUE
PRIM PFD YES X'D' TRUE TRUE
PRIM PFD YES X'E' FALSE FALSE
PRIM PFD YES X'F' FALSE FALSE
PRIM PFD NO X'A' FALSE FALSE
PRIM PFD NO X'B' FALSE FALSE
PRIM PFD NO X'C' FALSE FALSE
PRIM PFD NO X'D' FALSE FALSE
PRIM PFD NO X'E' FALSE FALSE
PRIM PFD NO X'F' TRUE TRUE