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

问题描述 投票:5回答:2

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

cobol
2个回答
8
投票

这是一种常见的做法。拥有可在调用程序的工作存储或本地存储部分中使用的副本以及被调用程序的链接部分可确保CALL上的参数匹配。

如另一个答案所述,在链接部分没有为副本分配存储空间。这与那里描述的任何其他变量没有什么不同。如果要对链接部分中定义的变量进行寻址,则必须将它们包含在过程分区的USING短语中,这允许调用参数与链接部分中描述的变量匹配 - 或者 - 您必须动态分配足够的存储空间大小以容纳这些变量并使用SET ADDRESS OF linkage-section-item TO指向分配存储的指针。如果您的编译器支持,可能在COBOL中分配存储的最便携方法是ALLOCATE语句。使用IBM Enterprise COBOL存储可以通过语言环境可调用服务CEEGTST分配,Micro Focus具有CBL_ALLOC_MEM,一些编译器和环境直接支持callin C函数,因此您可以在那里使用malloc()。

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

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

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


3
投票

运行程序时不会分配存储空间。您需要通过让程序调用带有副本的子程序作为参数之一并在PROCEDURE DIVISION USING中指定副本来获得它的可寻址性。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.