1

我遇到了简单的 cobol 调用的问题 - 返回测试程序。

我正在使用微焦点 cobol。

这是我的 2 个代码。

 ***************** CALLING PROGRAM 
   IDENTIFICATION DIVISION.
   PROGRAM-ID. callreturning.

   ENVIRONMENT DIVISION.

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 VA PIC S9(8) USAGE DISPLAY.
   01 VB PIC S9(8) USAGE DISPLAY.
   01 VC PIC 9(4) USAGE DISPLAY value 0.

   PROCEDURE DIVISION.
   MOVE 1 TO VA.
   MOVE 2 TO VB.
   move 3 to VC.
   CALL "add_two" USING  VA VB returning VC.

  * DISPLAY VA VB VC.
   EXIT PROGRAM.


   END PROGRAM callreturning.


  *********CALLED PROGRAM
   IDENTIFICATION DIVISION.
   PROGRAM-ID. add_two.

   ENVIRONMENT DIVISION.

   DATA DIVISION.

   LINKAGE SECTION.
   01 PARM_A PIC S9(8) USAGE DISPLAY.
   01 PARM_B PIC S9(8) USAGE DISPLAY.
   01 PARM_C PIC 9(4) USAGE DISPLAY value 0.

   PROCEDURE DIVISION USING PARM_A PARM_B returning PARM_C.
   move 3 to PARM_C.
  * ADD PARM_A TO PARM_B GIVING PARM_C.
   goback.
   END PROGRAM add_two.

CALLING 程序只是使用返回值调用第二个程序。

但是当我编译两个程序并运行时,就会发生错误。

错误代码:114,pc=0,call=1,seg=0 114 尝试访问超出内存边界的项目(信号 11)

我写错代码了吗?或其他问题?请帮我 :)

  • 我正在测试“返回”短语
4

3 回答 3

1

如果您摆脱该returning语句,您的程序将编译并正常工作。

于 2014-06-21T15:59:22.800 回答
0

背景

链接部分中定义的 01 级别更像是 C 程序中的指针。对于普通参数,它们由调用程序设置。但是返回的参数将被取消分配。

错误可能是由于尝试使用未分配的指针引起的。

解决方案

  1. 不要像使用 java 之类的语言一样使用返回。
  2. 在使用它之前将存储分配给返回值。

看:

最后,返回用于使用java。返回时定义的任何“类型”都应该与java兼容(即二进制长而不是9(4))。我强烈建议不要在 Cobol 中使用 Returning,除非您调用其他语言。

于 2014-06-23T02:38:22.630 回答
0

老问题,所以我尝试一个简短的答案:

首先,在 MF-COBOL 中使用返回没有任何问题。所以,这是本机 COBOL(我假设 NetExpress 作为 IDE)。要纠正 ist 只需更改第二个程序:

  1. 将 PARM_C 从链接移动到工作存储部分
  2. 程序部在其开场声明中没有得到返回短语。将其移至 goback 短语:
使用 PARM_A PARM_B 的程序划分。
  *>...
goback 返回 PARM_C。
于 2015-11-19T16:28:32.970 回答