4

我正在使用 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'
4

2 回答 2

2

如果您查看屏幕顶部菜单栏中的 COBOL 选项,Program type您将看到两个选项ExecutableModule.

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

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

披露:我是那里的版主。

您应该知道,“main”的概念实际上并不存在于 COBOL 本身中,而不是以您可能知道的其他语言的方式存在。初始程序的确切运行方式取决于实现和操作系统。

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

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

如果学习 COBOL,请保持现代化。在 PROCEDURE DIVISION 中,不要将句号/句点附加到代码行,并且只在必要时使用它们,而不是在可选的地方使用它们。在早期的 COBOL 标准中,句号/句点是唯一可用的范围终止符,为了向后兼容,它仍然充当“超级范围终止符”,这通常不是您想要的,如果它是什么你想要,这是不好的做法,因为任何其他读者都会认为这是一个错误,并想知道你的真正意图。

需要句号/句号:终止 PROCEDURE DIVISION 语句;终止段落或部分标签;终止段落或部分本身;终止程序。

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

您的子程序不包含 GOBACK、RETURN 或 EXIT PROGRAM。即使这样可行,它也是非标准的、不可移植的,也不是学习 COBOL 的好方法。

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

这是一种意见,您无需遵循该建议,但在实践中就是这样。

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

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

那么有什么意义呢?

仅仅因为它包含一个数字而将字段定义为数字并没有任何好处。您永远不会使用学生 ID 进行计算,因此最好是 PIC X 而不是 PIC 9。

于 2015-10-29T22:17:20.133 回答
1

独立于 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
于 2015-12-04T15:01:19.930 回答