使用OpenCOBOLIDE时调用子程序

时间:2015-10-29 20:31:15

标签: cobol gnucobol

我正在使用OpenCOBOLIDE并试图只是简单地调用一个子程序。我正在跟踪TutorialPoint文档。我按照所有说明但似乎无法弄清楚为什么当我调用子程序时它仍然无法找到我想要链接到的模块。

这是我的主要文件:

IDENTIFICATION DIVISION.
   PROGRAM-ID. MAIN.

   DATA DIVISION.
    WORKING-STORAGE SECTION.
       01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
       01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.

   PROCEDURE DIVISION.
   CALL 'UTIL' USING WS-STUDENT-ID, WS-STUDENT-NAME.
   DISPLAY 'Student Id : ' WS-STUDENT-ID
   DISPLAY 'Student Name : ' WS-STUDENT-NAME
   STOP RUN.

这是我的子程序:

 IDENTIFICATION DIVISION.
   PROGRAM-ID. UTIL.

   DATA DIVISION.
    LINKAGE SECTION.
       01 LS-STUDENT-ID PIC 9(4).
       01 LS-STUDENT-NAME PIC A(15).

   PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
       DISPLAY 'In Called Program'.
       MOVE 1111 TO LS-STUDENT-ID.
   EXIT PROGRAM.

如果有帮助,我正在使用OpenCobolIDE-4.6.5。

我得到的信息是:

MAIN.cbl:16: libcob: Cannot find module 'UTIL'

2 个答案:

答案 0 :(得分:4)

如果您查看屏幕顶部菜单栏中的COBOL选项,请选择Program type,您会看到两个选项:Executable; Module

对于从OS启动的程序,MAIN,您需要将其设置为Executable。对于CALLed程序UTIL,您需要将其设置为Module。

您还应该尝试安装GnuCOBOL,这是OpenCOBOL的新名称。 GnuCOBOL积极维护。 GnuCOBOL网站目前位于SourceForge.Net。最近在Help getting started中讨论了如何做到这一点(对于Ubuntu,无论如何,如果你使用更多不同的东西,发帖提问并且你会得到帮助)。

披露:我是那里的主持人。

你应该意识到" main"的概念。实际上并不存在于COBOL本身,而不是您可能知道的其他语言。初始程序的具体操作方式取决于实现和操作系统。

在Linux / Unix / Windows上,初始程序的编译方式不同,因此它更像是" main"。在IBM大型机上,它的编译方式不同。

另请注意,子例程可以调用另一个子例程。在您的情况下,您需要将两者编译为模块。它不是COBOL规定的,而是操作系统和实现。

如果学习COBOL,就要现代化。在PROCEDURE DIVISION中,不要在一行代码中附加一个句号/句点,只在需要的地方使用它们,而不是在它们是可选的地方。在早期的COBOL标准中,全停止/周期是唯一可用的范围终结符,并且为了向后兼容性,它仍然作为超范围终结符"这通常不是你想要的,如果它是你想要的,这是不好的做法,因为任何其他读者都会认为它是一个错误,并想知道你真正想要的是什么。

需要一个句号/期限:终止PROCEDURE DIVISION声明;终止段落或SECTION标签;终止段落或SECTION本身;终止程序。

如果使用COPYREPLACE编译器指令,您还需要终止具有句号/句点的那些。

您的子程序不包含GOBACK,RETURN或EXIT PROGRAM。即使它起作用,它也将是非标准的,不可移植的,并且不是学习COBOL的好方法。

在COBOL编程的现实世界中,您赢得/可能永远不会找到使用的PIC A.它被认为没什么好处,因为它只是阻止您在同一语句中将该字段用作源和数字字段作为目标。使用PIC X而不是PIC A是您通常会看到的,所以您现在也可以开始(尽管任何教程可能会说)。

这是一个意见,你没有必要遵循这个建议,但在实践中就是这样。

在COBOL语句中使用逗号(或任何其他不相关的分隔符)只会覆盖程序。他们没有真正的价值。这是有效的:

PROCEDURE DIVISION USING LS-STUDENT-ID, , , , , LS-STUDENT-NAME.

那么重点是什么?

将字段定义为数字没有任何好处,因为它包含数字。你永远不会用student-id进行计算,所以它更好的是PIC X而不是PIC 9。

答案 1 :(得分:2)

与Bill的优秀言论无关,我今天确实面临与OpenCobolIDE相同的问题。并找到了解决方案。

您必须参数创建的.dll的路径,以便调用程序可以找到被调用的模块。编译[F8]模块时,会有一条消息告诉您dll的去向:

Compilation succeeded (output: C:\Users\Mariah Flaim\bin\MyModule.dll)

现在,您必须转到参数[F2],编译器选项卡,并在“库路径”列表中添加指向此路径的链接。并且,奇迹如何,呼叫发生!!!

一个非常简单的例子,只是为了尝试,我已经在这个操作之后做了,从他们的模板开始(需要更多的工作才能干净,但是它有效)。

致电计划:

   IDENTIFICATION DIVISION.
  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
   PROGRAM-ID. YOUR-PROGRAM-NAME.
   ENVIRONMENT DIVISION.
  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
   CONFIGURATION SECTION.
  *-----------------------
   INPUT-OUTPUT SECTION.
  *-----------------------
   DATA DIVISION.
  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
   FILE SECTION.
  *-----------------------
   WORKING-STORAGE SECTION.
   01 PARAMETRES.
       02 PA-RETURN-CODE PIC 99 VALUE 0.
  *-----------------------
   PROCEDURE DIVISION.
  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
   MAIN-PROCEDURE.
  **
  * The main procedure of the program
  **
        CALL "MYMODULE"
        USING PARAMETRES
        DISPLAY "Hello world"
        STOP RUN.
  ** add other procedures here
   END PROGRAM YOUR-PROGRAM-NAME.

被叫模块:

   IDENTIFICATION DIVISION.
  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
   PROGRAM-ID. MYMODULE.
   ENVIRONMENT DIVISION.
  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
   CONFIGURATION SECTION.
  *-----------------------
   INPUT-OUTPUT SECTION.
  *-----------------------
   DATA DIVISION.
  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
   FILE SECTION.
  *-----------------------
   WORKING-STORAGE SECTION.
  *-----------------------
   LINKAGE SECTION.
  **-*-*-*-*-*-*-*-*-*-*-*-*-*
   01 PARAMETRES.
       02 PA-RETURN-CODE PIC 99 VALUE 0.
   PROCEDURE DIVISION USING PARAMETRES.
  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
   MAIN-PROCEDURE.
  **
  * The main procedure of the program
  **
    DISPLAY "Glu"
    MOVE 0 TO PA-RETURN-CODE
    GOBACK.
  ** add other procedures here
   END PROGRAM MYMODULE.

输出:

Glu
Hello world