CALL语句中BY CONTENT和BY VALUE有什么区别?

时间:2015-09-20 12:19:47

标签: cobol calling-convention

COBOL中BY CONTENT语句中BY VALUECALL之间的区别是什么?

2 个答案:

答案 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 ?1BY CONTENT之间的区别在于BY VALUE只有值被传递,因此{{1}不会传递所有类型的变量复制变量的指针被传递,这样就可以传递每种类型的变量。

请参阅:http://documentation.microfocus.com/help/index.jsp?topic=%2Fcom.microfocus.eclipse.infocenter.visualcobol.eclipseux%2FGUID-EB09203C-3873-4DBE-9298-0C353BC0701A.html

  

参考:

     

通过引用传递参数时,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