Cobol 整个联动部分是否返回?

Cobol 整个联动部分是否返回?,cobol,mainframe,cics,Cobol,Mainframe,Cics,在程序a中 EXEC CICS LINK PROGRAM(PGMB) COMMAREA(COMMA) LENGTH(LENGTH OF COMMA) RESP(CICS-RESP) END-EXEC 在程序b中 EXEC CICS RETURN END-EXEC 程序b是否只返回程序a通过的commarea?还是返回整个链接部分?我已经有一段时间没有享受到编写CICS的乐趣了,这个答案基于我仍然记得的知识 调用程序最多获取小于或等于调用程序中发送的数据区域大小的数据量

在程序a中

EXEC CICS LINK
   PROGRAM(PGMB)
   COMMAREA(COMMA)
   LENGTH(LENGTH OF COMMA)
   RESP(CICS-RESP)
END-EXEC
在程序b中

EXEC CICS RETURN
END-EXEC

程序b是否只返回程序a通过的commarea?还是返回整个链接部分?

我已经有一段时间没有享受到编写CICS的乐趣了,这个答案基于我仍然记得的知识

调用程序最多获取小于或等于调用程序中发送的数据区域大小的数据量(或由可选长度参数指定的数据量)。不要试图访问您发送的数据以外的数据

因此,如果程序x链接到程序y,对y中的COMMAREA所做的任何更新都将在x中可见 来源:

当通过EXEC CICS LINK命令传递通信区域时,调用的程序被传递一个指向通信区域本身的指针。当控制返回到调用程序时,对调用程序中数据区内容所做的任何更改都可供调用程序使用;要访问任何此类更改,程序将在原始COMMAREA选项中指定的数据区域命名为。源:

那么,程序b是否只返回程序a通过的commarea?

我的回答是肯定的

Does it return the whole linkage section?

至于这个,它取决于链接程序的DFHCOMMAREA的结构。如果它只包含1个这样的区域,那么答案是它返回的字节数与从该区域通过链接命令发送的字节数相同(隐式或显式)。请记住,此区域不在调用方的范围内。因此,如果调用方发送100个字节,而链接部分的区域为500个字节,则最多只能返回100个。

我已经有一段时间没有享受到编写CICS的乐趣了,这个答案基于我仍然记得的知识

调用程序最多只能获取小于或等于调用程序中发送的数据区域大小的数据量(或由可选长度参数指定的数据量)。不要尝试访问超出已发送数据量的数据

因此,如果程序x链接到程序y,对y中的COMMAREA所做的任何更新都将在x中可见 来源:

当通过EXEC CICS LINK命令传递通信区域时,调用的程序被传递一个指向通信区域本身的指针。当控制返回到调用程序时,对调用程序中数据区内容所做的任何更改都可供调用程序使用;要访问任何此类更改,程序将在原始COMMAREA选项中指定的数据区域命名为。源:

那么,程序b是否只返回程序a通过的commarea?

我的回答是肯定的

Does it return the whole linkage section?

至于这个,它取决于链接程序的DFHCOMMAREA的结构。如果它只包含1个这样的区域,那么答案是它返回的字节数与从该区域通过链接命令发送的字节数相同(隐式或显式)。请记住,此区域位于调用者之外。因此,如果调用者发送100字节,而链接部分的区域为500字节,则最多只能返回100个。

程序B既不返回整个链接部分,也不返回commarea(在您的示例中为逗号)

它什么也不返回

为什么它什么也不返回?因为没有传递给它

或者,更确切地说,传递给它的只是参数的地址。没有其他。仅此而已。重要的是,没有长度

PROGA

01  some-stuff.
    05  a-bit-of-stuff PIC X.
    05  the-rest-of-the-stuff PIC X(99).

CALL .... USING a-bit-of-stuff
程序

一个比特的东西被定义为只有一个字节。这没有什么区别。它是在链接部分中,使用…对过程部分中的项进行的定义,按照引用顺序,它不匹配调用…使用

PROGB将被“传递”一个比特的地址。如果该地址随后被映射到被调用程序链接部分的100字节,COBOL根本不介意

如果我们将这个示例调用改为使用一些东西,因为一些东西的起始地址与一些东西的起始地址相同,那么生成的代码绝对没有变化,两个程序的执行也没有变化

在调用者和被调用者之间定义不同大小的数据通常是不可能的,因为这会让我们人类不太清楚。编译器一点也不关心

你需要把01(或者77,如果你喜欢这个愚蠢的想法的话)看作是一个重定义。它们是一个重定义,一个隐式的定义,是在其他地方定义的数据。没有为链接部分中的项目定义数据(主机上有一个例外)链接部分中的01级只是重新定义或映射传递给程序的数据地址。数据不会“离开”调用程序,数据也不会“传回”

当然,如果在USINGs上使用不同的长度来匹配项,则可能会出现问题。如果调用方的存储是“获取的”(如CICS中的GETMAIN),则尝试引用该存储之外的数据,即使再引用一个字节,也会因寻址异常而导致异常终止(一个S0C4,CICS将为您命名另一个名称,一个AKEA)

即使没有获取的存储,如果被调用程序中的定义较短,则“传递”后的其他字段可能会意外地被丢弃,或者字段本身可能无法获得被调用程序移动到它的预期数据量

实际上,从被调用的程序中“返回”的东西有两个,它们是特殊寄存器返回代码,以及返回过程部分的单个项(如果使用,可能不会)


即便如此,实现这些功能的机制也不同于对调用程序和被调用程序之间“传递”的数据的正常误解。

程序B既不返回整个链接部分,也不返回commarea(在您的示例中为逗号)

它什么也不返回

为什么它什么也不返回?因为没有传递给它

<
Exec CICS
   Return 
End-Exec