【问题标题】:What is the difference between BY CONTENT and BY VALUE in a CALL statement?CALL 语句中的 BY CONTENT 和 BY VALUE 有什么区别?
【发布时间】:2015-09-20 12:19:47
【问题描述】:

COBOL 中CALL 语句中的BY CONTENTBY VALUE 有什么区别?

【问题讨论】:

  • 问题应该提到操作系统和编译器。目前的答案包括对于不同编译器并不总是正确的细节。例如,BY VALUE 并不总是限于{一个“整数”或单字节字母数字值)和文字,并且任何有效的数据类型都可以在至少一些 COBOL 编译器中通过 BY VALUE。

标签: cobol calling-convention


【解决方案1】:

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 将值本身放入“参数列表”中。

【讨论】:

  • @ven,谢谢,虽然我认为我应该寻找机会使用我的新词“manged”。
  • 当然,COBOL 的发展领域会有一些机会让你这样做:-)。
【解决方案2】:

按内容传递参数与按引用传递相同,只是在调用完成时数据不会复制回 COBOL 内存。这意味着被调用单元无法编辑原始变量。

所以BY CONTENTBY VALUE之间的区别在于BY VALUE只有值被传递,因此并非所有类型的变量都可以通过这种方式传递,而BY CONTENT是复制变量的指针被传递,这样每一种类型的变量都可以被传递。

见: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,包括值类型)不能通过引用传递 (或按价值 - 见下文)。

按内容

通过内容传递参数与通过引用传递相同, 除了数据没有被复制回 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

【讨论】:

  • 我不同意你的观点,无论是 JVM 还是没有 JVM,它的工作原理都是一样的,并且包含与接受的答案相同的信息。
  • 嗯,从被调用程序的角度来看,它们是相同的。他们没有被复制回来是一种倒退的说法,他们被复制到一次性存储并且任何更改都将被忽略。
  • 谢谢,更新了答案以更能反映问题。
猜你喜欢
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 2017-01-20
  • 2016-09-04
  • 2021-03-24
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多