如果调用者将不同长度的参数(例如,不同的记录类型)传递给被调用者,如何在COBOL中正确处理该参数。解决这种情况的一种方法是
calee在LINKAGE SECTION中定义不同类型的记录,并使用参数获得可寻址性。
LINKAGE SECTION.
01 recx pic x(10).
01 recy pic x(1000).
01 recz pic x(25).
01 rectype pic x(01).
01 rec pic x(1).
PROCEDURE DIVISION USING rectype rec.
EVALUTE TRUE
when rectype='x'
SET ADDRESS OF recx to ADDRESS of rec
when rectype='y'
SET ADDRESS OF recy to ADDRESS of rec
when rectype='z'
SET ADDRESS OF recz to ADDRESS of rec
处理这种情况是否正确?
答案 0 :(得分:4)
不,不是真的。
LINKAGE SECTION.
01 recx pic x(10).
01 recy
REDEFINES recx pic x(1000).
01 parm pic x(1).
01 rectype pic x(01).
88 use-recx VALUE "X".
88 use-recy VALUE "Y".
PROCEDURE DIVISION USING parm
rectype
recx.
EVALUTE TRUE
when use-recx
PERFORM process-recx
when use-recy
PERFORM process-recy
END-EVALUATE
GOBACK
.
USING ... recx
导致recx获取CALL上第二个参数的地址。由于REDEFINES,recy也获得相同的地址。如果你有一个recz,那也可以成为recx的重新定义。
然后第二个参数可用于识别该特定CALL中哪些不同的数据结构可用。
如果两个结构上的相同位置都有某些东西可以识别这两个结构,那么也可以使用它而不是需要rectype
。
LINKAGE SECTION本身只是一堆定义,一旦分配了地址就可以使用。如果你有300个程序在514个不同的地址用291个不同的数据结构调用你的程序,那没关系,因为所有CALLed程序看到的是当前CALL的当前数据结构的地址。
使用PROCEDURE DIVISION(或ENTRY语句)会导致生成代码,该代码会加载存储地址"传递"这样在USING上命名的01级(或77,但不要这样做)具有该地址。因此,所有不同的结构都可以重新定义,并且当您引用它们时,它们将全部自动地具有已传递给CALLed程序的地址。
如果查看输出列表,当您完成REDEFINES后,您会注意到所有这些结构都使用相同的BLL CELL
。它们都只是可用于当前CALL数据地址的映射。
你可以按照自己的方式去做,但这会是一种重复的努力。编译器将为USING上的第一个项执行相当于SET的操作,然后您将为该相同的地址执行实际的SET以手动将其分配给您的一个结构。除了重复之外,还引入了另一个可以引入错误的点。
另一种更常见的方法是传递一个指针块,然后使用SET指向所指向的数据。这被视为一种更灵活的方式,可以向程序添加新参数,而无需更改重新编译所有内容。然而,再次确定正确的额外负担。更灵活,更不明显,更难(相对)得到正确。
最后,实现目标的方式是在您的网站上完成的方式。没有人想要获得一个程序,并且必须在他们有机会查看业务逻辑之前理解技术上的工作方式。如果你采用不同的方式,你的不同代码将始终被怀疑 - "这里有一个错误,这里有一个奇怪的代码,我将把一些DISPLAYs放入并看看发生了什么"而不是寻找实际问题。