我正在使用 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)启动的程序,您需要将其设置为可执行文件。对于调用的程序 UTIL,您需要将其设置为模块。
您还应该尝试安装 GnuCOBOL,这是 OpenCOBOL 的新名称。 GnuCOBOL 得到积极维护。 GnuCOBOL 站点目前位于 SourceForge.Net。最近在
Help getting started
中有一个关于如何做到这一点的讨论(无论如何,对于 Ubuntu,如果您使用的是更不同的东西,发布一个问题,您将获得帮助)。
披露:我是那里的版主。
您应该意识到,“main”的概念实际上并不存在于 COBOL 本身中,也不以您可能知道的其他语言的方式存在。初始程序的具体运行方式取决于实现和操作系统。
在 Linux/Unix/Windows 上,初始程序的编译方式不同,因此它更像是“主”。在 IBM 大型机上,它的编译方式没有不同。
另请注意,一个子例程可以调用另一个子例程。在您的情况下,您需要将两者编译为模块。这不是 COBOL 决定的,而是操作系统和实现决定的。
如果学习 COBOL,请保持现代化。在 PROCEDURE DIVISION 中,不要在代码行中附加句号/句点,并且仅在必要的地方使用它们,而不是在可选的地方使用它们。在早期的 COBOL 标准中,句号/句点是唯一可用的作用域终止符,并且为了向后兼容,它仍然充当“超级作用域终止符”,这通常不是您想要的,如果它是这样的话你想要的,这是不好的做法,因为任何其他读者都会认为这是一个错误,并想知道你的真正意图是什么。
需要句号/句点:终止PROCEDURE DIVISION语句;终止段落或章节标签;终止段落或章节本身;终止程序。
如果使用
COPY
或 REPLACE
编译器指令,您还需要用句号/句点终止它们。
您的子例程不包含 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。
与 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
C:\Program Files (x86)\OpenCobolIDE\GnuCOBOL i