【问题标题】:How to move COMP-5 values to a Numeric field?如何将 COMP-5 值移动到数字字段?
【发布时间】:2021-10-20 15:30:56
【问题描述】:

我正在尝试将 COMP-5 变量(我从其他系统接收)移动到数字字段。我注意到,当我显示 COMP-5 变量时,我可以看到该值,但是当我尝试移动它时,COMP-5 变量中的值变为零。我没有任何使用 COMP-5 的经验。有人可以帮我解决这个问题吗?

代码:

   09 O-Xid.                                                
     12 O-Xid2-length                   PIC S9999 COMP-5 SYNC.                                                       
     12 O-Xid2                          PIC X(255).   
   09 WS-O-Xid.                                             
     12 WS-O-Xid2-length                PIC 9999.        
     12 WS-O-Xid2                       PIC X(255).      
      
                                                              
MOVE O-Xid2-length         TO WS-O-Xid2-length       
MOVE O-Xid2                TO WS-O-Xid2              

【问题讨论】:

  • 只是为了确保:您收到的O-Xid2-length-field 是 2 个字节?
  • @piet.t 感谢您的回答!是的,我收到了 O-Xid2 长度的 2 个字节。我仍然无法解决这个问题。任何我可能会出错的指针?
  • @Simon 是的,谢谢您的帮助!我浏览了文档,问题出在图片子句上,我的工作存储变量是 9(4),但由于 copybook 变量是 comp-5,它实际上是 32 个字节。当我将其更改为 X(32) 时,我可以看到填充了正确的值。
  • 所以您的COMP-5 问题完全没有使用COMP-5 解决了吗?注意:COMP-5 使字节大小更小,而不是更多;使用PIC X(32) 听起来很可疑......
  • @Simon COMP-5 是来自其他系统的传入数据。我的 cobol 程序中使用的变量不是 COMP-5。但是是的,当我增加字段大小时,只有我能够看到这些值。

标签: cobol


【解决方案1】:

您使用的MOVE 在任何数字USAGE 之间进行任何必要的转换,只要数据有效。

代码遗漏了实际的DISPLAY 语句,我假设您已使用DISPLAY O-Xid2-length 测试了有效数据(请指定输出)。

目标不包含源值的最可能原因是:
您使用的 COBOL 环境(您既没有指定编译器,也没有指定您使用的选项)不会根据 ANSI/ISO 截断 COMP-5 值 - 因此它可能包含“10000”,然后在 MOVE 上被截断,因为目标不能保存该值(此处发生的标准截断仅保留最后 4 位)。
所有其他情况都会出现“字段中没有您认为的数据”-再次:请同时指定“DISPLAY”语句和结果。

TRUNC(BIN) 的其他信息:根据docs

  • BINARY 当接收者为数字时,发送字段被处理为半字、全字或双字
  • DISPLAY 将转换二进制字段的全部内容,不会截断。

DISPLAY 也会显示类似 30000 的值,我认为MOVE 在这种情况下会导致零值。


对于其他 用法,存储在变量中的值可能实际上不是有效数据,但这不适用于BINARY(或COMP-5 项目)。在这种情况下,使用的 COBOL 环境可以对 DISPLAY 进行一些自动更正,但在 MOVE 上只需将无效值更改为 ZERO;检查您是否需要使用调试器或十六进制转储接收到的值。

【讨论】:

  • COMP-5 是“本机二进制”——没有“无效的COMP-5 数据”或“签名部分”之类的东西——我猜你在想COMP-3。在 HEX 模式下查看 DISPLAY-output 是个好主意。
  • @Simon 谢谢你的回答!我使用的编译器选项是 TRUNC(BIN) 吗?这会对数据表示有任何影响吗?
  • @piet.t 你当然是对的,我已经调整了答案,并添加了指向 trunc(bin) 的链接。
猜你喜欢
  • 2022-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多