使用OpenCOBOLIDE时调用子例程

使用OpenCOBOLIDE时调用子例程,cobol,gnucobol,Cobol,Gnucobol,我正在使用OpenCOBOLIDE,并试图简单地调用一个子例程。我在一个教程文档中跟随。我遵循了所有的指令,但似乎无法理解为什么调用子例程时它仍然找不到我试图链接到的模块 这是我的主要文件: IDENTIFICATION DIVISION. PROGRAM-ID. MAIN. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-STUDENT-ID PIC 9(4) VALUE 1000. 01 WS-ST

我正在使用OpenCOBOLIDE,并试图简单地调用一个子例程。我在一个教程文档中跟随。我遵循了所有的指令,但似乎无法理解为什么调用子例程时它仍然找不到我试图链接到的模块

这是我的主要文件:

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选项,选择
程序类型
,您将看到两个选项:
可执行文件
<代码>模块

对于从主操作系统启动的程序,需要将其设置为可执行。对于被调用的程序UTIL,需要将其设置为Module

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

披露:我是那里的主持人

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

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

还要注意,一个子例程可以调用另一个子例程。在您的案例中,您需要将这两者编译为模块。这不是COBOL的命令,而是操作系统和实现

如果你在学习COBOL,那就要现代化。在“程序”部分中,不要在代码行上附加句号/句号,只能在必要时使用,而不是在可选时使用。在早期的COBOL标准中,完全停止/周期是唯一可用的范围终结符,为了向后兼容,它仍然充当“超级作用域终止符”,它通常不是你想要的,如果它是你想要的,它是坏的实践,因为任何其他的读者都会认为它是一个错误,不知道你真正想要的是什么。 需要一个句号/句号:终止程序划分声明;终止段落或章节标签;终止一段或一节本身;终止一个程序

如果使用
COPY
REPLACE
编译器指令,还需要用句号/句点终止这些指令

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

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

这是一个观点,你不需要遵循这个建议,但实际上就是这样

在COBOL语句中使用逗号(或任何其他不相关的分隔符)只能对程序进行云计算。它们没有真正的价值。这是有效的:

PROCEDURE DIVISION USING LS-STUDENT-ID, , , , , LS-STUDENT-NAME.
那么重点是什么呢


仅仅因为字段包含数字就将其定义为数字没有任何好处。您永远不会使用学生id进行计算,因此最好是PICX而不是PIC9。

独立于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

我发现很难相信你有时间改变你的头像,但是没有时间给出任何反馈。啊。我应该已经认识到了注释/冗余的东西,因为:在4.7.6中,COBOL在Windows上是不需要的,比C++慢得多。为什么?