如何在cobol中显示comp变量的实际值
Posted
技术标签:
【中文标题】如何在cobol中显示comp变量的实际值【英文标题】:How to display the actual value of a comp variable in cobol 【发布时间】:2013-08-19 18:21:37 【问题描述】:我在 COBOL 程序中有以下变量,它在读取文件时从文件中获取其值:
01 Employee-number PIC 09(8) comp
01 Employee-number-x redefines
Employee-number PIC x(04)
我在同一个程序中有另一个变量:
01 D-element-number PIC 9(04)
现在,
将Employee-number
移动到D-element-number
然后我把这个D-element-number
写到一个文件中
从输入文件读取的值是:
0013
0024
所以这个值来到Employee-number
和Employee-number-x
,我把这个值移动到D-Element-number
并将这个变量写入一个输出文件。
但我在输出文件中得到了这个:
4660
FFFF
4660
4660
是 X'1234'
的十进制等效项
但我想看到类似的东西:
1234
FFFF
1234
我怎样才能做到这一点?
我可以更改D-element-number
的定义,但不能更改。
【问题讨论】:
01 D 元素编号 PIC 9(08) 或 PIC 9(09)。 @GilbertLeBlanc,是的,这是一个令人困惑的解释,所以它可能就是这么简单:-) @user2695332,您为什么要这样做,您能否消除问题中的困惑。如果您显示的数字是“垂直十六进制”,那么很高兴知道这一点,特别是对于 00001234,您还可以在其中显示您通常看到的“非显示”字符的“.”。您所说的“我可以更改 D 元素编号的定义,但没有别的”是什么意思,因为如果不编写其他代码可能无法实现 - 然后呢? @user2695332,编译列表中的 TRUNC 选项的值是多少?如果 BIN 你最好有 PIC 9(9),与 TRUNC(BIN) 一样,你可以获得一些 9 位数字。您的帐号有多大是告诉您该字段应该有多长的简短方法。 【参考方案1】:假设当你有 X'00001234' 你想要 C'00001234',看看这里。 http://ibmmainframes.com/viewtopic.php?p=234231#234231
暂时忽略其余的讨论,只关注该帖子。
这是关键部分:
PERFORM UNTIL X-WS-1000 > X-WS-1000-MAX
MOVE WS-1000-BYTE-TBL (X-WS-1000)
TO WS-PACKED-X (1:1)
MOVE WS-PACKED TO WS-DISPLAY
MOVE WS-DISPLAY-X TO WS-2000-BYTE-TBL (X-WS-2000)
SET X-WS-1000 UP BY 1
SET X-WS-2000 UP BY 1
END-PERFORM
您需要确切存储定义来配合它(不要“纠正”任何东西)。
它的工作原理是让编译器使用“解包”指令 (UNPK)。这个一次只工作一个字节,很容易解释。
X'12'(一个字节字段示例)被放入一个两字节字段中。 X'12ii'(其中 ii 的值是“无关的”)。
然后,UNPK 会将这个“打包”号码转换为“分区”号码。 “Zone”是一个字节的前四个 bts,对于 Zoned 数字,这四个位都设置为 1。所以你得到一个 F。然后你从第一个字节中得到最左边的数字。然后你得到第二个输出字节,前四位设置为 F,然后是第二个输入数字。
然后,UNPK 继续最后一个字节,其中包含一个不相关的数字和一个不相关的符号。对于分区数字,符号和最右边的数字占用相同的字节(区域中的符号),因此您会得到一个不相关的整个字节。
X'12' -> X'12ii' -> X'F1F1ii'。
三字节输出的前两个字节是C'12'。
不,数字什么都可以,但是字母会弄得一团糟:
X'AB' -> X'ABii' -> X'FAFBii'
虽然 F 和 a 数字给出了一个可显示的数字,但是对于 F 和一个字母来说,结果并没有太大的直接意义。
现在 INSPECT ... CONVERTING 来救援了:FA 被翻译成 C'A' (X'C1),同样的字母也被翻译成 F。
转换后的结果将是 C'AB'。
应该给你足够的工作。
还有其他方法,但这是对带有 UNPK 和 TRANSLATE (TR) 以及翻译值表的经典汇编器技术的公平 COBOL 近似。
如果您使用自己喜欢的搜索引擎。您应该能够使用计算(不止一个),表格查找来改进更多方法,我什至看到了“有效”的 256-WHEN EVALUATE,但我想它有点“慢”的一面。
进一步思考,您实际上有一个 BCD(二进制编码的十进制),不是吗?这是一个压缩十进制,没有符号。您的领域中没有任何 Alpha。
这更容易转换。
01 the-converted-value PACKED-DECIMAL PIC 9(8)V9 VALUE ZERO.
01 FILLER REDEFINES the-converted-value.
05 the-binary-value PIC X(4).
05 FILLER PIC X.
MOVE Employee-number-x TO the-binary-value
MOVE the-converted-value TO D-element-number (with Gilbert's correction to PIC 9(8)).
“小数位”是 ii,即忽略值和忽略符号。您不再需要 INSPECT ... CONVERTING ... 因为您只有数字。如果你有 BCD...
回答自己的问题的一个非常好的方法是首先找出数字是如何在二进制字段中创建的。
【讨论】:
【参考方案2】:没有尝试过,但我认为它可能会起作用:
01 WN-GROUP.
05 Employee-number PIC 9(8) comp.
05 PACKED-ZERO PIC 9(1) COMP-3 VALUE ZERO.
01 WN-PACKED redefines WN-GROUP PIC 9(9) COMP-3.
01 WN-UNPACKED PIC 9(9).
然后在你的程序中:
MOVE your-number TO Employee-number
MOVE WN-PACKED TO WN-UNPACKED.
最后你可以移动或显示 WN-PACKED(1:8)。
【讨论】:
嗯,你应该试过了。例如,WN-PACKED 只有五个字节长,但您建议使用八个字节。您也不能引用修改非 DISPLAY/NATIONAL 字段。我的回答中涵盖了您要做的事情,不是吗? 好吧,我试过了,它可以工作,只需将 WN-PACKED 移动到一个解压缩的变量。我正在编辑之前的代码。 不管怎样,我才意识到这个问题是 1 个月大的......哈哈大概比尔的回答就足够了 尝试改变这个:01 WN-PACKED 重新定义了 WN-GROUP PIC 9(9) COMP-3。为此:01 WN-PACKED 重新定义了 WN-GROUP PIC 9(8)V9 COMP-3。然后忘记参考修改。当字段被移动时,“小数位”将被截断。哈。刚刚注意到我的答案中的一个字段太长了...... 哦,是的!效果更好,无需移动位置。之前没有注意到您的第一个答案基本上是,对不起。以上是关于如何在cobol中显示comp变量的实际值的主要内容,如果未能解决你的问题,请参考以下文章
如何在 COBOL 的链接部分中使用外部变量并将值从它传递到新模块并写入我的新输出文件