La sentència CALL en COBOL és una instrucció utilitzada per invocar subprogrames o procediments des d'un programa principal. Aquesta funcionalitat permet la modularització del codi, facilitant la seva reutilització i manteniment. En aquest tema, explorarem com utilitzar la sentència CALL, els diferents tipus de subprogrames que es poden invocar, i com passar paràmetres entre el programa principal i els subprogrames.

Conceptes Clau

  1. Subprograma: Un bloc de codi que es pot invocar des d'un altre programa o subprograma.
  2. Programa Principal: El programa que invoca el subprograma.
  3. Paràmetres: Dades que es passen entre el programa principal i el subprograma.

Estructura de la Sentència CALL

La sintaxi bàsica de la sentència CALL és la següent:

CALL 'nom-del-subprograma' USING paràmetre1, paràmetre2, ...
  • nom-del-subprograma: El nom del subprograma que es vol invocar.
  • paràmetre1, paràmetre2, ...: Els paràmetres que es passen al subprograma.

Exemple Pràctic

Programa Principal

A continuació, es mostra un exemple d'un programa principal que invoca un subprograma anomenat SUBPROG:

IDENTIFICATION DIVISION.
PROGRAM-ID. MAINPROG.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(2) VALUE 10.
01 WS-NUM2 PIC 9(2) VALUE 20.
01 WS-RESULT PIC 9(2).

PROCEDURE DIVISION.
    DISPLAY 'Invocant el subprograma SUBPROG'.
    CALL 'SUBPROG' USING WS-NUM1, WS-NUM2, WS-RESULT.
    DISPLAY 'El resultat és: ' WS-RESULT.
    STOP RUN.

Subprograma

El subprograma SUBPROG que realitza una operació aritmètica simple (suma) és el següent:

IDENTIFICATION DIVISION.
PROGRAM-ID. SUBPROG.

DATA DIVISION.
LINKAGE SECTION.
01 LK-NUM1 PIC 9(2).
01 LK-NUM2 PIC 9(2).
01 LK-RESULT PIC 9(2).

PROCEDURE DIVISION USING LK-NUM1, LK-NUM2, LK-RESULT.
    COMPUTE LK-RESULT = LK-NUM1 + LK-NUM2.
    EXIT PROGRAM.

Explicació del Codi

  1. Programa Principal (MAINPROG):

    • Declara tres variables en la secció WORKING-STORAGE: WS-NUM1, WS-NUM2, i WS-RESULT.
    • Utilitza la sentència CALL per invocar el subprograma SUBPROG, passant les variables WS-NUM1, WS-NUM2, i WS-RESULT com a paràmetres.
    • Mostra el resultat retornat pel subprograma.
  2. Subprograma (SUBPROG):

    • Declara tres variables en la secció LINKAGE: LK-NUM1, LK-NUM2, i LK-RESULT.
    • Defineix el procediment USING per rebre els paràmetres del programa principal.
    • Realitza una operació de suma i emmagatzema el resultat en LK-RESULT.
    • Utilitza la sentència EXIT PROGRAM per tornar al programa principal.

Exercicis Pràctics

Exercici 1: Multiplicació de Nombres

Crea un programa principal que invoqui un subprograma per multiplicar dos nombres. El programa principal ha de passar dos nombres al subprograma i mostrar el resultat de la multiplicació.

Solució

Programa Principal:

IDENTIFICATION DIVISION.
PROGRAM-ID. MAINPROG.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(2) VALUE 5.
01 WS-NUM2 PIC 9(2) VALUE 4.
01 WS-RESULT PIC 9(2).

PROCEDURE DIVISION.
    DISPLAY 'Invocant el subprograma MULTIPLYPROG'.
    CALL 'MULTIPLYPROG' USING WS-NUM1, WS-NUM2, WS-RESULT.
    DISPLAY 'El resultat de la multiplicació és: ' WS-RESULT.
    STOP RUN.

Subprograma:

IDENTIFICATION DIVISION.
PROGRAM-ID. MULTIPLYPROG.

DATA DIVISION.
LINKAGE SECTION.
01 LK-NUM1 PIC 9(2).
01 LK-NUM2 PIC 9(2).
01 LK-RESULT PIC 9(2).

PROCEDURE DIVISION USING LK-NUM1, LK-NUM2, LK-RESULT.
    COMPUTE LK-RESULT = LK-NUM1 * LK-NUM2.
    EXIT PROGRAM.

Exercici 2: Concatenació de Cadenes

Crea un programa principal que invoqui un subprograma per concatenar dues cadenes de text. El programa principal ha de passar dues cadenes al subprograma i mostrar la cadena concatenada.

Solució

Programa Principal:

IDENTIFICATION DIVISION.
PROGRAM-ID. MAINPROG.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STRING1 PIC X(10) VALUE 'Hola'.
01 WS-STRING2 PIC X(10) VALUE 'Món'.
01 WS-RESULT PIC X(20).

PROCEDURE DIVISION.
    DISPLAY 'Invocant el subprograma CONCATPROG'.
    CALL 'CONCATPROG' USING WS-STRING1, WS-STRING2, WS-RESULT.
    DISPLAY 'La cadena concatenada és: ' WS-RESULT.
    STOP RUN.

Subprograma:

IDENTIFICATION DIVISION.
PROGRAM-ID. CONCATPROG.

DATA DIVISION.
LINKAGE SECTION.
01 LK-STRING1 PIC X(10).
01 LK-STRING2 PIC X(10).
01 LK-RESULT PIC X(20).

PROCEDURE DIVISION USING LK-STRING1, LK-STRING2, LK-RESULT.
    STRING LK-STRING1 DELIMITED BY SPACE
           LK-STRING2 DELIMITED BY SPACE
           INTO LK-RESULT.
    EXIT PROGRAM.

Errors Comuns i Solucions

  1. No Coincidència de Paràmetres: Assegura't que el nombre i tipus de paràmetres en la sentència CALL coincideixin amb els declarats en el subprograma.
  2. Variables No Inicialitzades: Inicialitza les variables abans de passar-les com a paràmetres per evitar resultats inesperats.
  3. Manca de la Sentència EXIT PROGRAM: Inclou sempre la sentència EXIT PROGRAM al final del subprograma per assegurar un retorn correcte al programa principal.

Resum

En aquesta secció, hem après com utilitzar la sentència CALL per invocar subprogrames en COBOL. Hem vist exemples pràctics de com passar paràmetres entre el programa principal i els subprogrames, i hem practicat amb exercicis per reforçar els conceptes apresos. La modularització del codi mitjançant subprogrames és una tècnica poderosa que millora la llegibilitat i mantenibilitat dels programes COBOL.

© Copyright 2024. Tots els drets reservats