COBOL关键字REDEFINES

18

我可以问一下,在COBOL中,关键字REDEFINES的用途是什么?我无法理解手册上的定义。

以下代码的意义是什么?

 01 WS_CHARGE_TXT_8X                             PIC X(08) VALUE "10000000".  
 01 WS_CHARGE_NUM_8 REDEFINES WS_CHARGE_TXT_8X.  
     05 WS_CHARGE_8                               PIC 9(05)V9(03).  

谢谢!

3个回答

21
基本上,“Redefines”可以重用空间,所以在上面的例子中,WS_CHARGE_TXT_8XWS_CHARGE_8将指向相同的内存块。这允许您以不同的方式查看一块内存,在本例中,该变量可以被视为文本PIC X和有符号数值PIC S9。变量名中的-8X-8只是样式上的,表示该变量被重新表示为另一种类型或格式对其他程序员。

在上面的例子中:

  • WS_CHARGE_TXT_8X的值是“10000000”
  • WS_CHARGE_8的值为10000.000。

如果将123.456移动到WS_CHARGE_8中,则WS_CHARGE_TXT_8X的值为"00123456"

以下是一个更有用的示例:

  03 Birth-Date-YYYYMMDD    pic 9(8).
  03 filler redefines Birth-Date-YYYYMMDD.
     05 Birth-Date-YYYY     pic 9(4).
     05 Birth-Date-MM       pic 99.
     05 Birth-Date-DD       pic 99.
在这种情况下,你可以访问整个日期`Birth-Date-YYYYMMDD`或者分别访问年/月/日(`Birth-Date-YYYY`等)。

快速问题:我们不能只保留出生日期YYYYMMDD吗?如果我们想要显示日期,只需执行DISPLAY填充器即可。 - Programmer
@程序员,我有点不确定你的问题,但你肯定可以单独定义出生日期(Birth-Date-YYYYMMDD)。 - Bruce Martin
通常填充值的字段是不需要被INITIALIZE初始化的。 将先前的字段重新定义并不是一个好的做法,因为这似乎是多余的。 - mckenzm
@mckenzm 所有 FILLER 都会被 INITIALIZE 忽略,无论是否有 VALUE。 - Bill Woodger

3

它类似于'C'中的union。它可以节省工作存储空间和MOVE语句,还可用于转置PIC(X)数组或将重复字段作为数组访问。在OP的情况下,数值“类型”被创建用于原型字段的字符内容。


当它不仅限于工作存储区时,它如何节省工作存储空间?为什么您想要/需要保存工作存储空间?自重新定义以来,大约已经过去了40年,这可能是有意义的用途。它如何节省MOVEs?“原型”?在COBOL中这是什么意思? - Bill Woodger
如果没有作为一个特性可用,那么就需要定义另一个区域并移动内容。请考虑这一点。传统上,COBOL不是关于获取主要内容和使用指针的。原型是我们建模的“原始”版本。在任何语言中(但尤其是在铁路模型中),这都是如此。 - mckenzm

1

REDEFINES允许对已定义的存储进行不同的数据描述。

这可能是为了允许完全不同的数据保存在那里。

05  RL-AGENT-DATA.
...
05  RL-CUSTOMER-DATA REDEFINES RL-AGENT-DATA.
...

或者提供一个描述,允许使用部分数据,就像布鲁斯的例子一样。

或者使用相同的数据片段,但是为了不同的目的:

05  INPUT-AMOUNT PIC X(10).
05  INPUT-AMOUNT-NUMERIC REDEFINES PIC 9(8)V99.

无论输入金额(INPUT-AMOUNT)中包含什么内容,只有在它是有效数字(通过测试NUMERIC)时才能报告,如果用于某些目的,则使用INPUT-AMOUNT-NUMERIC。

请注意,在FD下的第一个01之后的每个01都是“隐式REDEFINES”。

还要注意,LINKAGE SECTION中的项目具有“重新定义”“某物”的效果,即使数据的地址来自调用程序,定义通常与原始定义相同,并且通常应至少匹配原始PICture。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接