如果将本抄写本添加到链接部分而不是将其添加到子程序的工作存储部分中会发生什么?

Gan*_*h k 5 cobol

如果将本抄写本添加到链接部分而不是将其添加到子程序的工作存储部分中会发生什么?

csc*_*eid 8

这是一种常见的做法。具有可以在工作,存储或调用程序的本地储存部分,使用的字帖程序的连接段被称为确保在CALL匹配的参数。

如另一个答案中所述,在“链接”部分中没有为副本本分配存储空间。这与此处描述的任何其他变量没有什么不同。如果要对“链接”部分中定义的变量进行寻址,则必须将其包括在“过程分部”的“使用”短语中,该短语允许调用参数与“链接”部分中描述的变量匹配-或-您必须动态分配足够的存储空间大小以容纳这些变量,并使用SET ADDRESS OF linking-section-item TO指向已分配存储的指针。如果编译器支持的话,在COBOL中分配存储的最可移植的方法可能是ALLOCATE语句。使用IBM Enterprise COBOL存储可以通过语言环境可调用服务CEEGTST进行分配,Micro Focus具有CBL_ALLOC_MEM,

COBOL(和C等人)编译器不对传递的参数强制执行类型安全性。在运行时,被调用程序中的Linkage Section变量被映射到调用程序中CALL语句上变量的地址。

正如@SimonSobisch在评论中指出的那样,在COBOL标准中已经完成了一些工作,以通过原型在CALL上强制类型安全。并非所有的COBOL编译器都支持此功能。

如果您有一个抄写本,其中定义了子例程的调用参数,并且在调用程序的“工作存储”部分和它所调用的程序的“链接”部分中使用了相同的抄写本,则只需更改参数的定义即可只需在一个地方(本抄写本)完成,希望您的源代码管理系统将强制重新编译调用方和被调用程序,以确保没有参数不匹配。


小智 3

程序运行时不会分配存储空间。您将需要获得对其的可寻址性,方法是让程序以副本作为参数之一调用子程序,并使用...在程序部分中指定副本。

或者,您可以使用 GETMAIN 命令(如 EXEC CICS GETMAIN,如果您在 CICS 中)来分配一些存储,然后将 copybook 的地址设置为结果指针。

如果您尝试将值分配给副本而不执行任何操作,您将得到异常终止,可能是 S0C4(保护异常)。