如果将字帖添加到链接部分而不是将其添加到子程序的工作存储部分中会发生什么?
答案 0 :(得分:8)
这是一种常见的做法。拥有一个可以在调用程序的“工作存储”或“本地存储”部分和被调用程序的“链接”部分中使用的副本,可以确保CALL上的参数匹配。
在另一个答案中指出,在“链接”部分中没有为字帖分配存储空间。这与此处描述的任何其他变量没有什么不同。如果要对“链接”部分中定义的变量进行寻址,则必须将其包括在“过程分部”的“使用”短语中,该短语允许调用参数与“链接”部分中描述的变量匹配-或-您必须动态分配足够的存储空间大小以容纳这些变量,并使用SET ADDRESS OF linking-section-item TO指向已分配存储的指针。如果编译器支持的话,在COBOL中分配存储的最可移植的方法可能是ALLOCATE语句。使用IBM Enterprise COBOL存储可以通过语言环境可调用服务CEEGTST进行分配,Micro Focus具有CBL_ALLOC_MEM,某些编译器和环境直接支持inin C函数,因此您可以在此处使用malloc()。
COBOL(和C等人)编译器不对传递的参数强制执行类型安全性。在运行时,被调用程序中的Linkage Section变量将映射到调用程序中CALL语句上变量的地址。
正如@SimonSobisch的评论中所指出的那样,在COBOL标准中已经进行了一些工作,以通过原型对CALL实施类型安全。并非所有的COBOL编译器都支持此功能。
如果您有一个抄写本,其中定义了子例程的调用参数,并且在调用程序的“工作存储”部分和它所调用的程序的“链接”部分中使用了相同的抄写本,则更改为参数只需要放在一个地方(抄写本),并且希望您的源代码管理系统将强制重新编译调用方和被调用程序,以确保没有参数不匹配。
答案 1 :(得分:3)
在运行程序时不会分配存储。您将需要获得寻址能力,方法是使程序将抄写本作为参数之一调用该子程序,然后在“程序分区”中使用...指定抄写本。
或者,您可以使用GETMAIN命令(例如EXEC CICS GETMAIN,如果您在CICS中)来分配一些存储,然后将副本的地址设置为结果指针。
如果您尝试不给抄写本分配值,则将异常结束,可能是S0C4(保护异常)。