【发布时间】:2015-09-20 12:19:47
【问题描述】:
COBOL 中CALL 语句中的BY CONTENT 和BY VALUE 有什么区别?
【问题讨论】:
-
问题应该提到操作系统和编译器。目前的答案包括对于不同编译器并不总是正确的细节。例如,BY VALUE 并不总是限于{一个“整数”或单字节字母数字值)和文字,并且任何有效的数据类型都可以在至少一些 COBOL 编译器中通过 BY VALUE。
COBOL 中CALL 语句中的BY CONTENT 和BY VALUE 有什么区别?
【问题讨论】:
CALL 上的BY CONTENT 会将标识符的内容复制到编译器管理的存储区域,然后将“通过引用”隐式传递给被调用的程序。
这意味着CALLed程序可以更改数据,但CALLed程序中的任何更改都不会影响CALLing程序中的原始数据。
对编译器有效的任何大小的任何标识符都可以按内容使用(受任何限制(如果存在)为特定编译器记录的限制 - 你永远不知道)。
虽然您可以更改 CALLed 程序中的值,但这样做似乎有点晦涩,充其量。
BY VALUE 是一个完全不同的野兽。这是非常有限的,因为“通过”的值可以是“整数”或单字节字母数字值。它也可以是文字。
PROCEDURE DIVISION USING ... 必须知道,在 BY VALUE 的情况下,就是这样,通过以与 CALL 等效的方式指定它。 CALL 上的 BY REFERENCE 和 BY CONTENT 都是 PROCEDURE DIVISION USING 上的 BY REFERENCE。
如何实现取决于特定的编译器。 IBM Enterprise COBOL 将值本身放入“参数列表”中。
【讨论】:
按内容传递参数与按引用传递相同,只是在调用完成时数据不会复制回 COBOL 内存。这意味着被调用单元无法编辑原始变量。
所以BY CONTENT和BY VALUE之间的区别在于BY VALUE只有值被传递,因此并非所有类型的变量都可以通过这种方式传递,而BY CONTENT是复制变量的指针被传递,这样每一种类型的变量都可以被传递。
参考:
当通过引用传递参数时,JVM中的项目副本 COBOL 被传递给本机代码。当对本机的调用有 完成后,对本机代码中的信息所做的任何更改都是 复制回 JVM COBOL。然而,这确实意味着内存是 在 JVM 和本机环境之间共享。事实上,什么是 实际上传递给本机代码的是一个指向复制数据的指针。 如果您正在调用非 COBOL 程序,这很有用。影响 这一点非常重要,尤其是在多线程中 环境。对参考参数的任何更改均不可见 JVM COBOL 调用程序,直到调用完成。 任意复杂的组项目(在内存限制内)可以是 通过引用传递。组定义必须相同 本机和 JVM COBOL 源代码,它不能包含 USAGE POINTER 项目。字符串 (java.lang.Strings) 和表 (java.lang.byte 数组) 可以通过引用传递。所有其他对象(继承自 java.lang.Object,包括值类型)不能通过引用传递 (或按价值 - 见下文)。
按内容
通过内容传递参数与通过引用传递相同, 除了数据没有被复制回 JVM COBOL 内存时 通话已完成。任何可以通过引用传递的项目都可以 按内容传递。
按价值计算
在 JVM COBOL 中,唯一可以按值传递的项是 如下: binary-long - 按值传递的推荐类型 pic x(4) comp-x pic (9)9 comp pic s(9)9 comp pic (9)9 comp-5 pic s(9)9 comp-5
【讨论】: