Sentencia CALL

Sintaxis

CALL
nombre
[ ( [MAT] argumento [ , [MAT] argumento ...] ) ]
variable = 'nombre'
CALL @variable [ ( [MAT] argumento [ , [MAT]
argumento ...] ) ]

Descripción

Utilice la sentencia CALL para transferir el control del programa del programa de llamada a una subrutina externa o un programa que se ha compilado y catalogado.

Las subrutinas catalogadas de modo local se pueden llamar directamente. Especifique nombre utilizando el nombre exacto con el que se ha catalogado. Para obtener más detalles, consulte el mandato CATALOG.

Las subrutinas externas se pueden llamar directa o indirectamente. Para llamar una subrutina indirectamente, el nombre con el que está catalogada la subrutina debe estar asignado a una variable o a un elemento de una matriz. Este nombre de variable o especificador de elemento de matriz, con un signo de arroba (@) como prefijo, se utiliza como operando de la sentencia CALL.

La primera vez que se ejecuta una sentencia CALL, el sistema busca la subrutina en una biblioteca catalogada y cambia una variable que contiene el nombre de subrutina para que en su lugar contenga su información de ubicación. Con este procedimiento, no hace falta buscar de nuevo en el catálogo si en un momento posterior del programa se realiza una llamada a la misma subrutina. En el caso de las llamadas indirectas, se emplea la variable especificada en la sentencia CALL como @variable; en el caso de las llamadas directas, se utiliza una variable interna. Con el método indirecto, es mejor asignar el nombre de subrutina a la variable una sola vez en el programa, no cada vez que se utiliza la sentencia CALL indirecta.

Los valores de argumento son variables, matrices, variables de matriz, expresiones o constantes que representan valores reales. Puede pasar uno o varios argumentos del programa de llamada a una subrutina. El número de argumentos que se pasan en una sentencia CALL debe ser igual al número de argumentos especificados en la sentencia SUBROUTINE que identifica la subrutina. Si se pasan varios argumentos, deben separarse con comas. Si un argumento requiere más de una línea física, utilice una coma al final de la línea para indicar que la lista continúa.

Si argumento es una matriz, debe ir precedida de la palabra clave MAT, y la matriz debe estar denominada y dimensionada tanto en el programa de llamada como en la subrutina antes de emplear esta sentencia. Si la matriz no está dimensionada en la subrutina, debe declararse con la palabra clave MAT en la sentencia SUBROUTINE. Se pueden pasar otros argumentos a la vez independientemente del tamaño de la matriz.

Los valores reales de argumento no se pasan a la subrutina. En realidad, se pasa un puntero a la ubicación de cada uno de los argumentos. Pasar un puntero en lugar de los valores es más eficaz cuando deben pasarse muchos valores a la subrutina. Esta forma de pasar argumentos se denomina pasar por referencia; pasar los valores reales se denomina pasar por valor.

Todas las variables de matriz y escalares se pasan a las subrutinas por referencia. Si desea pasar variables por valor, delimítelas con paréntesis. Cuando se pasan datos por valor, el contenido de la variable en el programa principal no cambia como consecuencia de la manipulación de los datos en la subrutina. Cuando se pasan datos por referencia, la ubicación de memoria de la variable se modifica con la manipulación en el programa principal y en las subrutinas. Las constantes se pasan a las subrutinas por valor.

Cuando se pasa una matriz a una subrutina externa como argumento en una sentencia CALL, las dimensiones asignadas a la matriz en la subrutina se omiten. Las dimensiones de la matriz original en el programa de llamada se mantienen. Por consiguiente, es una práctica habitual y aceptable dimensionar la matriz en la subrutina con subíndices o índices de uno. Por ejemplo, puede dimensionar las matrices en la subrutina tal como se indica a continuación:

DIM A (1), B (1, 1), C (1, 1)

Cuando se pasan los argumentos de matriz correspondientes del programa de llamada a la subrutina en tiempo de ejecución, las matrices A, B y C heredan las dimensiones de las matrices en el programa de llamada. Los índices de la sentencia DIMENSION se omiten.

Un método mejor para declarar los argumentos de matriz en una subrutina consiste en utilizar la palabra clave MAT de la sentencia SUBROUTINE en la primera línea de la subrutina. El ejemplo siguiente indica a la subrutina que debe esperar las tres matrices A, B y C:

SUBROUTINE X(MAT A, MAT B, MAT C)

Cuando se encuentra una sentencia RETURN en la subrutina, o cuando la ejecución de la subrutina finaliza sin encontrar ninguna sentencia RETURN, el control vuelve a la sentencia que figura a continuación de la sentencia CALL en el programa de llamada. Para obtener más detalles, consulte la sentencia RETURN.

Ejemplos

El ejemplo siguiente realiza una llamada a la subrutina local SUB. No tiene ningún argumento.

CALL SUB

El ejemplo siguiente realiza una llamada a la subrutina local QTY.ROUTINE con tres argumentos:

CALL QTY.ROUTINE(X,Y,Z)

El ejemplo siguiente realiza una llamada a la subrutina catalogada como *PROGRAM.1 con seis argumentos. La lista de argumentos se puede expresar en más de una línea.

AAA="*PROGRAM.1"
CALL @AAA(QTY,SLS,ORDER,ANS,FILE.O,SEQ)

El ejemplo siguiente realiza una llamada a la subrutina *MA con tres argumentos. Se pasan sus tres argumentos y su índice.

STATE.TAX(1,2)='*MA'
CALL @STATE.TAX(1,2)(EMP.NO,GROSS,NET)

En el ejemplo siguiente se realiza una llamada a la subrutina catalogada como *SUB y se pasan dos matrices a dos matrices de subrutina. También se pasa un tercer argumento escalar.

GET.VALUE="*SUB"
DIM QTY(10)
DIM PRICE(10)
CALL @GET.VALUE( MAT QTY,MAT PRICE,COST )

El ejemplo siguiente muestra la sentencia SUBROUTINE en la subrutina SUB llamada por el ejemplo anterior. Las matrices Q y P no tienen que dimensionarse en la subrutina.

SUBROUTINE SUB( MAT Q,MAT P,C )