cobol - 使用 OpenCOBOLIDE 时调用子程序

标签 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'

最佳答案

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

对于从操作系统启动的程序,您的 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 标准中,句号/句点是唯一可用的范围终止符,为了向后兼容,它仍然充当“ super 范围终止符”,这通常不是您想要的,如果它是什么你想要,这是不好的做法,因为任何其他读者都会认为这是一个错误,并想知道你的真正意图。

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

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

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

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

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

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

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

那么有什么意义呢?

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

关于cobol - 使用 OpenCOBOLIDE 时调用子程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33424030/

相关文章:

java - 如何为 Cobol copybook 生成 java~jrecord 代码

file - 数据类型规范 '9(7)V9T' 是什么意思?

cobol - 您可以在同一行 COBOL 上接受两个输入吗?

antlr4 - Cobol - 解析 cobol 程序中的组项

cobol - 分两列打印

c - DevC++ C 调用 OpenCobolIDE 模块

cobol - 从压缩十进制字段中分割数字

cobol - OpenCOBOL 示例无法编译

cobol - 请求可执行程序,但 PROCEDURE/ENTRY 有 USING 子句

cobol - COBOL 的 ATAN 学位?