COBOL中BY CONTENT
语句中BY VALUE
和CALL
之间的区别是什么?
答案 0 :(得分:6)
BY CONTENT
上的 CALL
会将标识符的内容复制到编译器管理的存储区域,然后隐式地将其“通过引用”传递给CALLed程序。
这意味着CALLed程序可以更改数据,但CALLed程序中的任何更改都不会影响CALLing程序中的原始数据。
对于编译器有效的任何大小的任何标识符都可以按BY CONTENT使用(受限于任何限制,如果存在,则为特定编译器记录 - 您永远不知道)。
虽然可以更改CALLed程序中的值,但这样做似乎有点模糊。
BY VALUE
是一个完全不同的野兽。它非常有限,因为“传递”的值可以是“整数”或单字节的字母数字值。它也可以是文字。
对于BY VALUE,PROCEDURE DIVISION USING ...
必须知道是这样,通过以与CALL等效的方式指定它。 CALL上的参考和内容都是程序划分使用的参考。
如何实现它取决于特定的编译器。 IBM Enterprise COBOL将值本身放在“参数列表”中。
答案 1 :(得分:1)
按内容传递参数与通过引用传递相同,只是在调用完成后数据不会复制回COBOL内存。这意味着被叫单元无法编辑原始变量。
因此where x.firstname like ?1
和BY CONTENT
之间的区别在于BY VALUE
只有值被传递,因此{{1}不会传递所有类型的变量复制变量的指针被传递,这样就可以传递每种类型的变量。
参考:
通过引用传递参数时,JVM中项目的副本 COBOL传递给本机代码。当对本机的调用有 完成后,对本机代码中所做信息的任何更改都是 复制回JVM COBOL。但是,这确实意味着内存是 在JVM和本机环境之间共享。事实上,是什么 实际传递给本机代码的是指向复制数据的指针。 如果您正在调用非COBOL程序,这将非常有用。影响 这一点非常重要,特别是在多线程中 环境。对参考参数的任何更改都不可见 JVM COBOL调用程序,直到调用完成。 任意复杂的组项(在内存限制范围内)都可以 通过引用传递。组定义必须相同 本机和JVM COBOL源代码,它不能包含USAGE POINTER 项目。字符串(java.lang.Strings)和表(java.lang.byte数组) 可以通过引用传递。所有其他对象(继承自的类型) java.lang.Object,包括valuetypes)不能通过引用传递 (或按价值 - 见下文)。
按内容
按内容传递参数与通过引用传递相同, 除了数据没有被复制回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