Cobol v6.2 NUMCHECK选项兼容性

时间:2018-12-24 11:40:44

标签: options cobol mainframe mvs

我们不能为新的COBOL V6.2编译器关闭NUMCHECK选项,因为我们不信任数字变量的内容。 问题是,当我们打开它时,它与我们以前在组织中使用的COBOL 4不完全兼容。 具体来说-当一个无符号打包变量包含X'123C'时,COBOL 4将接受它并让我们继续,但是带有NUMCHECK(PAC,ABD)的COBOL 6.2退出,并且只愿意接受X'123F'。 对于我们来说,这是关于汇编程序调用COBOL或从文件等读取的真正问题。 是否有另一种选择甚至是PTF可以纠正此问题? 当NUMCHECK启用时,您能否指出我们其他不兼容之处(如果存在)?谢谢!佐哈尔

2 个答案:

答案 0 :(得分:3)

此文件已按记录工作。我知道这不是您想听到的,但是有时候就是这样。您的应用程序异常终止,因为NUMCHECK编译选项检测到它视为无效数据的地方。

请注意,IBM COBOL 6.2的NUMCLS安装选项控制IF NUMERIC类测试的行为,该测试的隐式版本由NUMCHECK编译选项生成。如果您打包的数据没有符号定义,即

77  XYZ  PIC 999 COMP-3.

然后文档指示x'F'的符号半字节是唯一将通过IF NUMERIC类测试的符号半字节。符号半字节的任何其他值均视为无效。

IBM COBOL 4.2的NUMCLS选项文档的措辞肯定不同。

您可能要检查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'的符号小数来表示正值,那么如果NUMCLS(ALT)有效,则可以使用NUMPROC(NOPFD)。

如果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

答案 1 :(得分:0)

我还没有添加评论的名声,所以我必须添加另一个答案。我是Enterprise COBOL开发人员之一,我可以说的是V4.2文档不够清晰,V6的措词已更改,但编译器的行为并未更改。两种编译器使用的行为都与上表cschneid的V5列匹配。

对于数字类测试,无论NUMPROC或NUMCLS设置是什么,无符号打包和分区数据项始终需要x'F'的符号。带符号的项始终允许C和D,带NUMPROC(NOPFD)的F(无论NUMCLS设置如何),以及仅对于NUMCLS = ALT,NUMPROC(NOPFD)的A,B和E。 NUMCLS的自定义指南中的文档仅讨论签名的类测试。

对于原始问题:NUMCHECK的行为与IS NUMERIC测试完全相同,并且在两种情况下,对于未签名的数据项,x'C'的符号均被视为无效,并且IS NUMERIC测试或NUMCHECK会发现该值不是数字/无效。在NUMPROC(PFD)下未定义带有x'C'符号的所有其他COBOL语句(比较,算术,MOVE等)的行为,并且在V4 / V6,V6中的OPT级别之间,ARCH之间可能有所不同在V6等级别。在某些情况下,在NUMPROC(NOPFD)下,在V4中使用NUMPROC(MIG)(在V6中不支持MIG),在使用该数据项中的值之前,将无符号项的符号强制为0xF。这保证了一定的行为以及行为兼容性。但是,NUMCHECK可以匹配IS NUMERIC类测试,还可以查找无效数据,因此可以对其进行纠正(否则使用NUMCHECK毫无意义,因为它添加到程序中的测试会对性能产生负面影响),因此需要进行标记所有无效数据,甚至是V4中似乎“正常工作”的数据(这实际上意味着,虽然NUMPROC(PFD)下的行为未定义,但至少是一致的。)

相关问题