2015-10-29 1 views
3

J'utilise OpenCOBOLIDE et j'essaie de simplement appeler un sous-programme. Je suis dans un document TutorialPoint. J'ai suivi toutes les instructions, mais je n'arrive pas à comprendre pourquoi quand j'appelle le sous-programme, il ne trouve toujours pas le module auquel j'essaye de faire le lien.Appel de sous-routine lors de l'utilisation d'OpenCOBOLIDE

Voici mon fichier principal:

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. 

Et voici mon sous-programme:

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. 

J'utilise OpenCobolIDE-4.6.5 si cela aide.

Le message que je reçois est:

MAIN.cbl:16: libcob: Cannot find module 'UTIL' 
+0

Je trouve difficile de croire que vous avez trouvé le temps de changer votre avatar, mais n'a pas trouver le temps de donner votre avis. –

Répondre

2

Si vous regardez l'option COBOL dans la barre de menus en haut de l'écran, sélectionnez Program type vous verrez deux options: Executable; Module.

Pour le programme démarré à partir du système d'exploitation, votre MAIN, vous devez définir sur Executable. Pour le programme CALLed, UTIL, vous devez le régler sur Module.

Vous devriez également essayer d'installer GnuCOBOL, qui est le nouveau nom d'OpenCOBOL. GnuCOBOL est activement maintenu. Le site GnuCOBOL est actuellement sur SourceForge.Net. Il y a une discussion récente dans le Help getting started pour savoir exactement comment faire cela (pour Ubuntu, de toute façon, si vous utilisez quelque chose de différent, postez une question et vous obtiendrez de l'aide).

Divulgation: Je suis un modérateur là.

Vous devez savoir que le concept de "principal" n'existe pas dans COBOL lui-même, pas dans le sens des autres langues que vous connaissez. Exactement comment fonctionne le programme initial est à la mise en œuvre et le système d'exploitation. Sous Linux/Unix/Windows, le programme initial est compilé différemment, donc il ressemble plus à un "principal". Sur un mainframe IBM, il n'est pas compilé différemment.

Notez également qu'un sous-programme peut APPELER un autre sous-programme. Vous devrez compiler les deux en tant que module dans votre cas. Ce n'est pas COBOL qui dicte cela, mais le système d'exploitation et l'implémentation. Si vous apprenez COBOL, soyez moderne à ce sujet. Dans la DIVISION DE LA PROCÉDURE, n'attachez pas un point/une période à une ligne de code et utilisez-les uniquement lorsqu'ils sont nécessaires, et non lorsqu'ils sont optionnels. Dans les normes COBOL antérieures, le point d'arrêt complet était la seule terminaison de portée disponible, et pour la rétrocompatibilité, il agit toujours comme un "super-scope-terminator" qui n'est généralement pas ce que vous voulez, et si c'était le cas vous voulez, c'est une mauvaise pratique que tout autre lecteur considérerait comme une erreur et se demander ce que vous aviez vraiment prévu.

Un arrêt/une période est nécessaire: pour terminer l'instruction PROCEDURE DIVISION; terminer un libellé de paragraphe ou de SECTION; pour terminer un paragraphe ou une section elle-même; pour terminer un programme.

Si vous utilisez une directive de compilation COPY ou REPLACE, vous devez également mettre fin à ceux-ci avec un point/une période.

Votre sous-programme ne contient pas de programme GOBACK, RETURN ou EXIT. Même si cela fonctionnait, ce serait non-standard, non portable et ne serait pas un bon moyen d'apprendre COBOL.

Dans le monde réel de la programmation COBOL, vous ne pouvez pas/jamais trouver un PIC A utilisé. Il est considéré comme peu utile, car tout ce qu'il fait est d'éviter d'utiliser ce champ comme source et un champ numérique comme cible dans la même déclaration. Utiliser un PIC X au lieu du PIC A est ce que vous verrez normalement, donc vous pouvez tout aussi bien commencer maintenant (malgré ce que n'importe quel tutoriel peut dire).

C'est une opinion, et vous n'avez pas besoin de suivre ce conseil, mais dans la pratique, c'est comme ça.

L'utilisation de virgules (ou de tout autre séparateur non pertinent) dans les instructions COBOL ne fait qu'ombrer un programme. Ils n'ont aucune valeur réelle. Ceci est valable:

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

Alors, quel serait le point?

Il n'y a aucun avantage à définir un champ comme numérique simplement parce qu'il contient un nombre. Vous n'allez jamais faire un calcul avec l'identifiant de l'étudiant, il vaut donc mieux qu'il soit PIC X et non PIC 9.

1

indépendamment des excellentes remarques de Bill, j'ai fait face au même problème avec OpenCobolIDE aujourd'hui. Et trouvé une solution.

Vous devez paramétrer les chemins du fichier .dll créé afin que le programme appelant puisse trouver le module appelé. Lorsque vous compilez [F8] votre module, vous avez un message qui vous indique où le dll est allé:

Compilation succeeded (output: C:\Users\Mariah Flaim\bin\MyModule.dll) 

Maintenant, vous devez aller aux paramètres [F2], dans l'onglet du compilateur, et ajouter un lien vers ce chemin dans la liste "Library path". Et, comment miracle, l'appel arrive !!!

Un exemple très simple, juste pour essayer, j'ai fait le travail après cette manœuvre, à partir de leurs modèles (aurait besoin de plus de travail pour être propre, mais cela fonctionne).

programme d'appel:

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. 

appelé Module:

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. 

Sortie:

Glu 
Hello world 
+0

Ah. J'aurais dû reconnaître que les commentaires/trucs redondants étaient générés :-) –