pointers - COBOL中处理不同长度的参数

标签 pointers cobol

如果调用者将不同长度的参数(例如不同的记录类型)传递给被调用者,如何在 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

这是处理这种情况的正确方法吗?

最佳答案

不,不是真的。

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 个不同数据结构的程序,这并不重要,因为所有被调用的程序看到的都是当前 CALL 的当前数据结构的地址。

PROCEDURE DIVISION(或 ENTRY 语句)上的 USING 会导致生成代码,该代码加载“传递”的存储地址,以便 USING 上命名的 01 级(或 77,但不要这样做)有那个地址。因此,您所有不同的结构都可以重新定义,并且当您引用它们时,它们都会自动具有已传递给被调用程序的地址。

如果您查看输出列表,完成 REDEFINES 后,您会注意到所有这些结构都使用相同的 BLL CELL。它们都只是可用于当前 CALL 的数据地址的映射。

可以按照自己的方式去做,但这会是重复的工作。编译器将为 USING 上的第一项执行相当于 SET 的操作,然后您将为同一地址执行实际的 SET 操作,以手动将其分配给您的一个结构。除了重复之外,它还引入了另一个可能引入错误的点。

另一种越来越常见的方法是传递一个指针 block ,然后使用 SET 来获取所指向的数据。这被视为一种更灵活的方式,能够向程序添加新参数,而无需更改或重新编译所有内容。然而,正确处理又会带来额外的负担。更大的灵活性,不那么明显,更难(相对)获得正确。

最后,执行此操作的方式就是在您的站点上执行此操作的方式。没有人愿意拿起一个程序,并且在有机会查看业务逻辑之前必须了解某些东西在技术上的工作方式。如果你采取不同的做法,你的不同代码将始终被怀疑 - “这里有一个错误,这是这个奇怪的代码,我将放入一些显示并看看发生了什么”,而不是寻找实际的问题。

关于pointers - COBOL中处理不同长度的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35042906/

相关文章:

c - 将参数传递给 main 时出现段错误

作为类方法的参数传递的函数的 c++ std::vector

COBOL comp 和 comp-3 字段的 Java 映射

cobol - COBOL 中的小数

cobol 使用长参数调用 C 函数

windows - OpenCOBOL 静态链接多个 .cob 文件

sql-server - 有没有办法从 z/OS 大型机访问 Sql 服务器并在 IBM 3270 终端仿真中得到结果?

c - struct node *head 和 struct node ** head 有什么区别?

c - 将多维数组作为指针传递给函数

c++ - 在递归中修改调用指针时出现问题