Вызов подпрограммы при использовании OpenCOBOLIDE

Я использую 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'

person Mariah Flaim    schedule 29.10.2015    source источник
comment
Мне трудно поверить, что вы нашли время, чтобы изменить свой аватар, но не нашли времени, чтобы дать какой-либо отзыв.   -  person Bill Woodger    schedule 03.11.2015


Ответы (2)


Если вы посмотрите на опцию COBOL в строке меню в верхней части экрана, выберите Program type, вы увидите две опции: Executable; Module.

Для программы, которая запускается из ОС, вашей ГЛАВНОЙ, вам нужно установить ее в Исполняемый файл. Для программы CALLed, UTIL, вам нужно установить значение Module.

Вам также следует попробовать установить GnuCOBOL, новое название OpenCOBOL. GnuCOBOL активно поддерживается. Сайт GnuCOBOL в настоящее время находится на SourceForge.Net. В Help getting started недавно обсуждалось, как именно это сделать (во всяком случае, для Ubuntu, если вы используете что-то более необычное, задайте вопрос, и вы получите помощь).

Раскрытие информации: я там модератор.

Вы должны знать, что понятие «основной» на самом деле не существует в самом COBOL, как и в других языках, которые вы, возможно, знаете. То, как именно работает исходная программа, зависит от реализации и операционной системы.

В Linux/Unix/Windows начальная программа компилируется по-другому, поэтому она больше похожа на "основную". На мейнфрейме IBM он не компилируется по-другому.

Также обратите внимание, что подпрограмма может ВЫЗВАТЬ другую подпрограмму. В вашем случае вам нужно будет скомпилировать оба как модуль. Это диктует не COBOL, а ОС и реализация.

Если вы изучаете COBOL, будьте современны. В PROCEDURE DIVISION не добавляйте точку/точку к строке кода и используйте их только там, где они необходимы, а не там, где они необязательны. В более ранних стандартах COBOL точка/точка была единственным доступным ограничителем области действия, и для обратной совместимости она по-прежнему действует как «ограничитель суперобласти действия», который обычно не является тем, что вам нужно, и если бы это было то, что хотите, это плохая практика, так как любой другой читатель сочтет это ошибкой и задастся вопросом, что вы на самом деле имели в виду.

Точка/точка необходима: для завершения оператора PROCEDURE DIVISION; для завершения абзаца или метки SECTION; для завершения абзаца или самого РАЗДЕЛА; для завершения программы.

Если вы используете директиву компилятора COPY или REPLACE, вам также необходимо завершать их с точкой/точкой.

Ваша подпрограмма не содержит ПРОГРАММУ ВОЗВРАТА, ВОЗВРАТА или ВЫХОДА. Даже если бы это сработало, это было бы нестандартно, непереносимо и не было бы хорошим способом изучения COBOL.

В реальном мире программирования COBOL вы никогда не найдете PIC A. Считается, что от этого мало пользы, так как все, что он делает, это мешает вам использовать это поле в качестве источника и числовое поле в качестве цели в одном и том же операторе. Использование PIC X вместо PIC A — это то, что вы обычно видите, поэтому вы можете начать прямо сейчас (несмотря на то, что может быть сказано в любом учебнике).

Это мнение, и вам не нужно следовать этому совету, но на практике так оно и есть.

Использование запятых (или любого другого не относящегося к делу разделителя) в операторах COBOL только затуманивает программу. Они не имеют подлинной ценности. Это действительно:

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

Так в чем смысл?

Нет смысла определять поле как числовое просто потому, что оно содержит число. Вы никогда не будете делать расчеты со студенческим билетом, поэтому гораздо лучше, чтобы это был PIC X, а не PIC 9.

person Bill Woodger    schedule 29.10.2015
comment
COBOL в Windows намного медленнее, чем C++. Почему? - person ; 14.03.2018

Независимо от прекрасных замечаний Билла, сегодня я столкнулся с той же проблемой с 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
person gazzz0x2z    schedule 04.12.2015
comment
Ах. Я должен был распознать комментарии/лишние вещи как сгенерированные :-) - person Bill Woodger; 05.12.2015
comment
В 4.7.6 он не нужен. - person ; 14.03.2018