2015-10-29 3 views
3

Я использую OpenCOBOLIDE и пытаюсь просто вызвать подпрограмму. Я следую в документе TutorialPoint. Я выполнил все инструкции, но не могу понять, почему, когда я вызываю подпрограмму, он все еще не может найти модуль, к которому я пытаюсь подключиться.Вызов подпрограммы при использовании 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' 
+0

Я считаю, что трудно поверить, что вы нашли время, чтобы изменить свой аватар, но не сделал найдите время, чтобы дать любую обратную связь. –

ответ

2

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

Для программы, запускаемой с ОС, в ОС MAIN, для этого вам необходимо установить исполняемый файл. Для программы CALLed, UTIL, вам нужно установить этот модуль.

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

Раскрытие информации: Я являюсь модератором.

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

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

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

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

Нужна полная остановка/период: прекратить утверждение ПРОЦЕДУРЫ ОТДЕЛЕНИЯ; прекратить действие пункта или метки SECTION; прекратить действие пункта или самой СЕКЦИИ; для завершения программы.

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

Ваша подпрограмма не содержит ПРОГРАММЫ GOBACK, RETURN или EXIT. Даже если бы это сработало, это было бы нестандартным, не переносным и не было бы хорошим способом узнать COBOL.

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

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

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

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

И какой смысл?

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

1

Независимо от замечательных замечаний Билла, я столкнулся с той же проблемой с OpenCobolIDE сегодня. И нашел решение.

Вы должны указать путь к DLL, созданный так, чтобы программа вызывающего абонента могла найти вызываемый модуль. При компиляции [F8] ваш модуль, у вас есть сообщение о том, где делись дллы:

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 
+0

Ах. Я должен был признать комментарии/избыточные вещи как сгенерированные :-) –