我正在开发opencoobol1.1,遇到了奇怪的问题:
这是 Cobol 代码:
03 WS-INP PIC X(30).
03 WS-INP-D REDEFINES WS-INP.
05 WS-AMT1 PIC S9(6)V99 SIGN IS TRAILING SEPARATE.
MOVE 'QQQQQQQQQQQQ' TO WS-INP
DISPLAY WS-INP
IF WS-AMT1 NOT NUMERIC
DISPLAY WS-AMT1
END-IF
DISPLAY WS-INP
代码执行后,WS-INP的值变为'QQQQQQQQQQ-Q'!支持保持不变:'QQQQQQQQQQQQ'。
那么,代码有什么问题呢?我发现是“IF xxx NUMERIC”句子(又名“IF WS-AMT1 NOT NUMERIC”)导致了问题,而 WS-AMT1 的类型(又名“SIGN IS TRAILING SEPARATE”)导致了问题。
如果类型不是“SIGN IS TRAILING SEPARATE”,则一切正常。但是“标志尾随分开”有什么问题吗?
删除“SIGN IS TRAILING SEPARATE”后,一切正常。
我怀疑他的陈述改变了字段内容:
IF WS-AMT1 NOT NUMERIC
由于 WS-AMT1 被定义为有符号数,因此在检查最后一个值中的符号时,此语句可能会导致最后一个字节的值被“标准化”,这意味着第一个半字节被设置为x'C'(正数)。这最终会导致在将字段显示为有效数字时出现奇怪的字符。
请注意,这取决于编译器的工作方式,也可能取决于所使用的编译器选项。我不了解 opencobol,所以我必须做出假设。
我想你实际上想显示字符字段,如果该字段不是数字,也许像这样
IF WS-AMT1 NOT NUMERIC
DISPLAY WS-INP
ELSE
DISPLAY WS-INP
END-IF