« COBOL/Sous-programmes » : différence entre les versions

Contenu supprimé Contenu ajouté
catégorisation - Modif. navigateur chapitre
Guillpetiot (discussion | contributions)
mAucun résumé des modifications
Ligne 17 :
Considérons un programme principal (appelant) a et un programme secondaire (appelé) b. Le programme a fait appel au programme b en utilisant l'instruction CALL :
 
<source lang="cobol">
CALL prg [USING { [REFERENCE] x y ...} ... ].
CONTENT</source>
 
où prg est le nom du programme appelé, par exemple dans notre cas, nous mettrons "b".
Ligne 34 ⟶ 35 :
Les variables passées en paramètre doivent être définies dans la LINKAGE SECTION de la DATA DIVISION (juste après la WORKING-STORAGE SECTION) du sous-programme appelé. Ces définitions doivent être identiques à celles des variables originales (définies dans le programme appelant), à ceci près que la clause VALUE ne peut être utilisée.
 
<source lang="cobol">
DATA DIVISION.
LINKAGE SECTION.
{images}</source>
 
Vous devez également préciser dans la PROCEDURE DIVISION du programme appelé une clause USING permettant d'énumérer ces variables : leur ordre d'apparition est important, il doit correspondre à l'ordre utilisé lors de l'appel du sous-programme (l'instruction CALL).
 
<source lang="cobol">PROCEDURE DIVISION [USING {identificateur} ...].</source>
 
Il n'est pas nécessaire que les variables aient le même nom dans le programme appelant et le programme appelé. La correspondance des arguments entre les 2 programmes ne se fait pas sur leur nom mais sur leur ordre d'apparition.
Ligne 52 ⟶ 54 :
La première façon de faire est de définir les sous-programmes l'un après l'autre. Voici par exemple la définition d'un programme a puis la définition d'un programme b.
 
<source lang="cobol">
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. a.
000003 PROCEDURE DIVISION.
000004 prog.
000005 DISPLAY "Vous êtes dans A".
000006 CALL "b".
000006 CALL "b".
000007 DISPLAY "Vous êtes de retour dans A".
000008 STOP RUN.
000009 END PROGRAM a.
000010****************************
000011 IDENTIFICATION DIVISION.
000012 PROGRAM-ID. b.
000013 PROCEDURE DIVISION.
000014 prog.
000015 DISPLAY "Vous êtes dans B".
000016 EXIT PROGRAM.
000017 END PROGRAM b.</source>
 
b est appelé par a, l'instruction STOP RUN (qui met fin à l'exécution) est remplacée par EXIT PROGRAM qui marque la fin du sous-programme.
Ligne 76 ⟶ 79 :
La seconde façon de faire est d'imbriquer la définition du sous-programme appelé dans celle du sous-programme appelant :
 
<source lang="cobol">
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. a.
000003 PROCEDURE DIVISION.
000004 prog-a.
000005 CALL "b".
000006000005 STOPCALL RUN"b".
000006 CALLSTOP "b"RUN.
000007***********************
000008 IDENTIFICATION DIVISION.
000009 PROGRAM-ID. b.
000010 PROCEDURE DIVISION.
000011 prog-b.
000012 EXIT PROGRAM.
000013 END PROGRAM b.
000014***********************
000015 END PROGRAM a.
000015 END PROGRAM a.</source>
 
Ici, la définition du sous-programme b est imbriquée dans celle du sous-programme a : elle est placée entre le STOP RUN qui marque la fin de l'exécution (en clair : après la dernière instruction) et le END PROGRAM qui marque la fin du programme.
Ligne 100 ⟶ 104 :
Voici un programme dans lequel nous définissons un sous-programme max (lignes 15 à 29), appelé à partir du programme principal a (lignes 1 à 13).
 
<source lang="cobol">
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. a.
000003 DATA DIVISION.
000004 WORKING-STORAGE SECTION.
000005 77 x PIC 999 VALUE 34.
000006000005 77 yx PIC 999 VALUE 7734.
000007000006 77 maxy PIC 999 VALUE 77.
000005000007 77 xmax PIC 999 VALUE 34.
000008 PROCEDURE DIVISION.
000009 main.
000010 CALL "max" USING CONTENT x y REFERENCE max.
000011000010 DISPLAYCALL "max (" USING CONTENT x "," y ") = "REFERENCE max.
000011 DISPLAY "max (" x "," y ") = " max.
000012 STOP RUN.
000013 END PROGRAM a.
000015000013 END PROGRAM a.
000014****************************
000015 IDENTIFICATION DIVISION.
000016 PROGRAM-ID. max.
000017 DATA DIVISION.
000018 LINKAGE SECTION.
000019 77 a PIC 999.
000020000019 77 ba PIC 999.
000021000020 77 maxb PIC 999.
000019000021 77 amax PIC 999.
000022 PROCEDURE DIVISION USING a b max.
000023 prog.
000024 IF a > b
000024 IF a > b
000025 THEN MOVE a TO max
000026 ELSE MOVE b TO max
000027 END-IF.
000028 EXIT PROGRAM.
000029 END PROGRAM max.</source>
 
Nous passons 3 variables à notre sous-programme : 2 que nous ne modifierons pas et que nous passerons donc par valeur, et une dernière qui prendra la valeur du maximum des deux autres que nous passerons par référence.