如何在 COBOL 的链接部分中使用外部变量并将值从它传递到新模块并写入我的新输出文件
Posted
技术标签:
【中文标题】如何在 COBOL 的链接部分中使用外部变量并将值从它传递到新模块并写入我的新输出文件【英文标题】:How to use an external variable in linkage section in COBOL and pass values from it into a new module and write into my new output file 【发布时间】:2021-04-12 07:06:56 【问题描述】:有人可以告诉我为什么在模块中将变量声明为“外部”,以及如何通过链接部分在其他模块中使用该变量,以及如何将它们传递到新字段中以便我可以将其写入新文件。
【问题讨论】:
【参考方案1】:EXTERNAL
项目通常在WORKING-STORAGE
中找到。这些通常不会通过 CALL
和 LINKAGE
从一个程序传递到另一个程序,而是通过 COBOL 运行时直接共享。
将项目声明为EXTERNAL
的行为类似于“运行时命名的全局存储”,您为全局内存分配名称和长度,并且可以在同一运行时单元中的任何位置访问它(不需要直接的CALL
),即使在类似以下情况:
MAIN
-> CALL B
B: somevar EXTERNAL
-> MOVE 'TEST' TO somevar
-> CANCEL B
-> CALL C
C: somevar EXTERNAL -> now contains 'TEST'
【讨论】:
【参考方案2】:在运行 z/OS 的 IBM Z 大型机上,所有高级语言 (HLL) 的运行时例程称为 Language Environment (LE)。几十年前,每个 HLL 都有自己的运行时,当它们混入同一个运行单元时会导致一些问题;从 1990 年代初开始,IBM 将所有 HLL 转换为 LE 以用于其运行时。
LE 具有enclave 的概念。该链接上的部分文本表示,飞地相当于 COBOL 中的运行单元。
您的问题被标记为 CICS,有时在该环境中运行时标记为 behavior is different。引用该链接...
在 CICS 下,执行 CICS LINK 命令会创建语言环境所称的子飞地。一个新的环境被初始化并且子飞地得到它的运行时选项。这些运行时选项独立于创建飞地中存在的那些选项。
[...]
执行 CICS XCTL 命令时会发生类似的情况。在这种情况下,我们没有获得子飞地,但现有飞地被终止,然后使用为新程序确定的运行时选项重新初始化。同样的性能考虑也适用。
因此,正如@SimonSobich 所指出的,如果您在CICS 中运行时使用CALL 来调用您的子例程,EXTERNAL 数据对于运行单元来说是全局的。但是,如果您使用 EXEC CICS XCTL 来调用您的子例程,您可能会看到不同的行为并且必须以不同的方式设计您的应用程序。
【讨论】:
以上是关于如何在 COBOL 的链接部分中使用外部变量并将值从它传递到新模块并写入我的新输出文件的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Python 变量转换为等效的 cobol 组变量?
如何将链接部分数据传递到 COBOL 中另一个程序的链接部分