Cobol v6.2 NUMCHECK选项兼容性

问题描述 投票:1回答:2

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

options cobol mainframe mvs
2个回答
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

0
投票

我还没有声明添加评论,所以我将不得不添加另一个答案。我是企业COBOL开发人员之一,我可以说,V4.2文档不太清楚,V6的措辞已经改变,但编译器的行为却没有。编译器使用的行为与上面cschneid表中的V5列匹配。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.