Las funciones y procedimientos también pueden usar parámetros, los parámetros son el medio de comunicación que permite pasar variables del programa a un procedimiento o función. Los parámetros se encierran entre dos paréntesis y se debe indicar el tipo de dato que se va usar con los parámetros. A continuación el primer ejemplo:
Se puede observar que las variables globales a,b,c se colocarón después de haber escrito el procedimiento Lectura y la función suma. Esto es posible debido a que el procedimiento Lectura y la función Suma no usan directamente las variables globales a y b del programa, si no que los usan a través de sus parámetros de un modo indirecto. Si los procedimientos Suma y Lectura no tuvierán que usar estas variables globales entonces se deben declarar antes de crear o escribir los procedimientos o funciones mencionados.
Como puede observar en el programa anterior, el procedimiento Lectura hace uso de la palabra reservada Var antes de declarar sus parámetros, esto permite indicarle al procedimiento que el valor de la variable que se pasa a través de sus parámetros, puede ser modificado dentro del procedimiento por cualquier instrucción.
Es decir si queremos que el procedimiento o función nos permita devolver alterados o cambiados los valores de las variables ingresadas a través de sus parámetros, entonces hacemos uso de la palabra reservada var en caso contrario no la usamos, y los valores de las variables no serán alteradas así se use una instrucción de asignación. Las variables ingresadas deben ser estrictamente del tipo de dato declarado en el procedimiento o función, es decir por ejemplo si las variables a,b fueran de tipo byte entonces el compilador no podría compilar el programa.
Además cuando se declara un parámetro como Var, le estamos indicando al procedimiento o función que no cree una copia de dicha variable en memoria, y cuando declaramos un parámetro sin Var entonces el procedimiento o función creará una copia en memoria, el espacio de memoria en donde se colocan las copias de dichos parámetros se conoce como Pila.
Se conocen como parámetros por referencia, a los parámetros que usan la palabra reservada Var, ya que estos parámetros se usan como referencia para poder acceder y cambiar los valores de la variable que se coloca en el parámetro.
Las variables locales de un procedimiento o función también se almacenan en la Pila. Cuando un procedimiento o función finaliza con su conjunto de instrucciones los parámetros y sus variables locales son destruidos o liberados dejando espacio para ser usados por otro procedimiento o función.
Los identificadores de los parámetros pueden ser los mismos que cualquier variable global declarada dentro de un programa, pero sin embargo dentro de la definición o declaración de los parámetros de una función o procedimiento, no deben existir identificadores con el mismo nombre. Es decir lo siguiente es incorrecto:
Function Suma(b, b:integer): integer;
Si deseamos usar parámetros con tipos de datos diferentes en nuestras funciones o procedimientos, es decir definir los parámetros a y b como un integer y el parámetro c como un double, se debe separar los parámetros a y b del parámetro c, usando el punto y coma. Tal como se muestra a continuación:
Function Operacion01(a, b:integer; c:double):integer;
Los parámetros que usen tipos de datos simples como los números enteros, booleanos, caracteres, y reales se usan del modo como se explico anteriormente, pero para usar los tipos de datos string o cadena de caracteres en las funciones y procedimientos como parámetros, se deben usar del siguiente modo:
procedure (Cad01:string; cad02:string[10]);
como puede observar cad01 y cad02 están separados por un punto y coma, debido a que ambos son parámetros con diferente cantidad de caracteres; también se puede definir un tipo de dato, a cambio de usar el string[10], del siguiente modo:
Type
Cad10 = String[10];
procedure (Cad01:string; cad02:Cad10);
A continuación un ejemplo:
La función Vocales del programa anterior cuenta las vocales que tiene una frase, de acuerdo al juego de caracteres IBM 437 y sin tomar en consideración el tamaño de la cadena de caracteres. Cuando un parámetro de tipo de dato string es de menor longitud y se pasa una variable de tipo de dato string de mayor longitud, lo que hará el compilador es truncar dicha variable a la longitud que se usa en el parámetro. A continuación un ejemplo :
El programa anterior no es muy útil pero demuestra lo explicado anteriormente. Para los tipos de datos enumerados y subrango se debe crear el tipo de dato con anterioridad, para usarlo después como un tipo de dato en el parámetro, es decir primero declaramos el tipo de dato enumerado:
Type
TNumeros = (cero, uno, dos, tres, cuatro);
y después, lo usamos en la declaración del procedimiento, del siguiente modo:
procedure (M:TNumeros);
Del mismo modo se hace con los tipos de datos subrango. A continuación un ejemplo usando un tipo de dato enumerado:
El programa nos permite convertir una longitud a centímetros, pulgadas, pies y yardas. Para ello el programa usa dos funciones, la función Convertir tiene tres parámetros n, unidad01 y unidad02; los parámetros unidad01 y unidad02 son de tipo TUnidades que es un tipo de dato enumerado, la función convertir hace uso de la función ord para realizar la conversión de las medidas, usando el arreglo valores. La función LeeUnidades devuelve un tipo de dato enumerado TUnidades, como se puede observar en el ejemplo, cuando queremos usar como parámetro un tipo de dato enumerado primero se debe declarar el tipo de dato con anterioridad para después usarlo en el procedimiento o función. Para el caso de los conjuntos también se procede del mismo modo, a continuación un ejemplo:
Cuando queramos usar registros en los parametros de una función o procedimiento se tiene que crear el tipo de dato que representa al registro, el siguiente programa crea un tipo de dato registro con identificador TAlumno, que después será usado en los procedimientos LeerRegistro y MostrarRegistro.
El programa anterior es un programa que se uso en capítulos anteriores y lo único que hace es leer los registros del arreglo, ordenarlos y mostrarlos por pantalla ordenados por el nombre. El programa ordena la lista acorde al alfabeto en latín, (El alfabeto latín no tiene ñ).
A modo de resumen se puede decir que cuando deseamos usar los tipos de datos enumerados, subrangos, conjuntos y registros se debe definir un tipo de dato para usarlo como parámetros en nuestros procedimientos o funciones. Para usar los arreglos como parámetros en los procedimientos o funciones, se debe primero definir como tipo de dato para después usarlo en la cabecera del procedimiento o función, del mismo modo como la hacíamos con los tipos de datos enumerados, subrangos, conjuntos y registros, ejemplo:
Type Tlista30=array [1..30] of integer;
Procedure HacerAlgo(Var N:Tlista30);
El procedimiento o función sólo aceptara arreglos con la misma cantidad de elementos, si se intentase pasar un arreglo de menor o mayor cantidad de elementos no se podrá compilar el programa. A continuación un ejemplo: