X 类型变量(REDEFINGED AS 数字,带有“SIGN IS TRAILING SEPARATE”)在执行“IF xxx NUMERIC”后更改

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

我正在开发 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”后,一切正常。

cobol trailing
1个回答
0
投票

我怀疑他的陈述改变了字段内容:

IF WS-AMT1 NOT NUMERIC

由于 WS-AMT1 被定义为有符号数,因此在检查最后一个值中的符号时,此语句可能会导致最后一个字节的值被“标准化”,这意味着第一个半字节被设置为x'C'(正数)。这最终会导致在将字段显示为有效数字时出现奇怪的字符。

请注意,这取决于编译器的工作方式,也可能取决于所使用的编译器选项。我不了解 opencobol,所以我必须做出假设。

我想你实际上想显示字符字段,如果该字段不是数字,也许像这样

IF WS-AMT1 NOT NUMERIC       
   DISPLAY WS-INP
ELSE
   DISPLAY WS-INP 
END-IF
© www.soinside.com 2019 - 2024. All rights reserved.