CALL - Llamada a un Programa Público

Sintaxis

CALL programa{::etiqueta}{,ERR=reflínea}{,expr...}

El verbo CALL invoca otro programa como si esta fuese una subrutina. El programa llamado, algunas veces llamado “programa público”, se ejecuta con sus propias variables. Esto resulta útil para escribir procedimientos comunes, tales como programas selectores de impresoras, ya que no es necesario preocuparse de conflictos en nombres de variables. Vea la sección Program and Workspace Management del capítulo 1 para una detallada discusión acerca de los programas públicos.

Puede especificar una lista de argumentos para pasar datos hacia y desde el programa que ha llamado. Pro5 soporta argumentos de llamada de referencia y llamada de valor.

Para crear programas públicos que pueden actuar como bibliotecas de gestión de eventos las rutinas, el parámetro fileid puede contener una etiqueta de referencia incluida, precedida por dos puntos (::), para especificar la ubicación de partida del programa llamado. Puede incluir una instrucción ENTER por cada punto de entrada. Si la etiqueta especificada no existe, PRO5 dará !ERROR=21 en el programa público.

Un argumento de llamada de referencia es una simple variable numérica, una variable entera, o una variable string. El programa llamado puede retornar valores al programa que lo llamó a través de estos argumentos. Se puede pasar un arreglo completo por medio de hacer referencia del tipo X[ALL], donde X es cualquier nombre de arreglo. Pro5 puede pasar un arreglo no dimensionado sin que ocurra un error durante el paso, pero mostrará un error cuan el programa llamado trate de accesar el arreglo.

Cualquier otro argumento es un llamado de valor. El programa llamado recibe el valor del argumento desde el programa que lo llamó, pero el programa llamado no puede retornar un valor al programa que lo llamó a través de este argumento.

El siguiente es un ejemplo de la instrucción CALL:

>CALL “PROGRAMA”,A,B$,A0[ALL],(A),X+3,D$(1,4),F[30],”XX”

En este ejemplo, los primeros tres argumentos son llamadas de referencia, por que son simples variables y arreglos. El resto de los argumentos son llamadas de valor porque:

· (A) es una simple variable forzada por los paréntesis a ser un argumento valor.

· X+3 es una expresión.

· D$(1,4) es un string suscrito (no es considerado una simple variable).

· F[30] es un solo elemento de un arreglo.

· “XX” es una constante.

El mismo argumento de llamada de referencia no puede aparecer más de una vez en la lista de argumentos. La instrucción ENTER en el programa llamado completa en enlace para los argumentos.

Los canales de los archivos son globales. El programa que llama y el programa llamado comparten todos los canales de archivos. Los canales abiertos en el programa llamado no se cierran automáticamente cuando el control regresa al programa que llama.

Pro5 ejecuta la instrucción CALL en dos pasos:

1. Primero, procesa la lista de argumentos.

2. Segundo, localiza el programa llamado en la memoria o en el disco y lo carga si es necesario.

La ejecución continúa con la primera instrucción del programa llamado. Los verbos EXIT, END y STOP son usados en el programa llamado para regresar el control al programa que hizo la llamada.

Pro5 tome una bifurcación opcional de ERR= si ocurre un error en la lista de argumentos, un error en la carga del programa, o si el programa llamado “sale” con un error. Vea Error Reporting & Handling, en la documentación.

Pro5 guarda la siguiente información cuando un programa es llamado y es retornada cuando termina la ejecución del programa.

· Variables, excepto aquellas pasadas por referencia, o a menos que el programa llamado opte por compartir todas las variables (vea ENTER en este capítulo para más información)

· Información de reintentos en errores

· Precisión aritmética actual

· Valor SETERR

· Valor SETESC

· Ciclos GOSUB, FOR/NEXT y WHILE/WEND activos

· Puntero de instrucciones DATA

Pro5 inicializa los siguientes ítems cuando se entra al programa llamado:

· Variables

· Valores SETERR

· Valores SETESC

· Información sobre reintento en errores

· Información de GOSUB, FOR/NEXT y WHILE/WEND

· Instrucciones DATA

Ejemplos

>CALL “XYZ”

1000 CALL “XYZ”,ERR=9500,A$,B$,C,D/2+E,F$+G$,B[ALL]

>CALL "test.bbx"

1000 CALL "test.bbx::ruti1",ERR=9500,A$,B$,B,C,D/2+E,F$,G$,B[ALL]

>CALL "PUBPROG"

1010 SETERR 1030

1020 ENTER A$,B$,C$

1030 IF A$="" PRINT "sin argumentos"; EXIT

1040 SETERR 9000

1050 ...