Diferencia entre revisiones de «Programación en Pascal/Funciones y procedimientos»

Contenido eliminado Contenido añadido
Línea 95:
 
En el próximo apartado veremos la diferencia entre pasar parámetros por valor (lo que hemos estado haciendo) y por referencia (para poder modificarlos), y jugaremos un poco con la recursividad.
 
Procedimientos con parámetros (2).
Ya habíamos visto qué era eso de los procedimientos y las funciones, pero habíamos dejado aparcados dos temas importantes: los tipos de parámetros y la recursividad.
 
Vamos con el primero. Ya habíamos visto, sin entrar en detalles, qué es eso de los parámetros: una serie de datos extra que indicábamos entre paréntesis en la cabecera de un procedimiento o función.
 
Es algo que estamos usando, sin saberlo, desde el primer día, cuando empezamos a usar "WriteLn":
 
writeln( 'Hola' );
 
Esta línea es una llamada al procedimiento "WriteLn", y como parámetros le estamos indicando lo que queremos que escriba, en este caso, el texto "Hola".
 
Pero vamos a ver qué ocurre si hacemos cosas como ésta:
 
{--------------------------}
{ Ejemplo en Pascal: }
{ }
{ Primer procedimiento }
{ que modif. variables }
{ PROCMOD1.PAS }
{ }
{ Este fuente procede de }
{ CUPAS, curso de Pascal }
{ por Nacho Cabanes }
{ }
{ Comprobado con: }
{ - Turbo Pascal 7.0 }
{ - Turbo Pascal 5.0 }
{ - Surpas 1.00 }
{--------------------------}
 
program PruebaDeParametros;
 
var dato: integer;
 
procedure modifica( variable : integer);
begin
variable := 3 ;
writeln( 'Dentro: ', variable );
end;
 
begin
dato := 2;
writeln( 'Antes: ', dato );
modifica( dato );
writeln( 'Después: ', dato );
end.
 
¿Qué podemos esperar que pase? Vamos a ir siguiendo cada instrucción:
 
* Declaramos el nombre del programa. No hay problema.
* Usaremos la variable "dato", de tipo entero.
* El procedimiento "modifica" toma una variable de tipo entero, le asigna el valor 3 y la escribe. Lógicamente, siempre escribirá 3.
* Empieza el cuerpo del programa: damos el valor 2 a "dato".
* Escribimos el valor de "dato". Claramente, será 2.
* Llamamos al procedimiento "modifica", que asigna el valor 3 a "dato" y lo escribe.
* Finalmente volvemos a escribir el valor de "dato"... ¿3?
 
 
¡¡¡¡NO!!!! Escribe un 2. Las modificaciones que hagamos a "dato" dentro del procedimiento modifica sólo son válidas mientras estemos dentro de ese procedimiento. Lo que modificamos es la variable genérica que hemos llamado "variable", y que no existe fuera del procedimiento.
 
Eso es pasar un parámetro por valor. Podemos leer su valor, pero no podemos alterarlo.
 
Pero, ¿cómo lo hacemos si realmente queremos modificar el parámetro. Pues nada más que añadir la palabra "var" delante de cada parámetro que queremos permitir que se pueda modificar...
 
Procedimientos con parámetros (3).
El programa quedaría:
 
{--------------------------}
{ Ejemplo en Pascal: }
{ }
{ Segundo proc. que }
{ modifica variables }
{ PROCMOD2.PAS }
{ }
{ Este fuente procede de }
{ CUPAS, curso de Pascal }
{ por Nacho Cabanes }
{ }
{ Comprobado con: }
{ - Turbo Pascal 7.0 }
{ - Turbo Pascal 5.0 }
{ - Surpas 1.00 }
{--------------------------}
 
program PruebaDeParametros2;
 
var dato: integer;
 
procedure modifica( var variable : integer);
begin
variable := 3 ;
writeln( 'Dentro: ', variable );
end;
 
begin
dato := 2;
writeln( 'Antes: ', dato );
modifica( dato );
writeln( 'Después: ', dato );
end.
 
 
Esta vez la última línea del programa sí que escribe un 3 y no un 2, porque hemos permitido que los cambios hechos a la variable salgan del procedimiento (para eso hemos añadido la palabra "var"). Esto es pasar un parámetro por referencia.
 
El nombre "referencia" alude a que no se pasa realmente al procedimiento o función el valor de la variable, sino la dirección de memoria en la que se encuentra, algo que más adelante llamaremos un "puntero".
 
Una de las aplicaciones más habituales de pasar parámetros por referencia es cuando una función debe devolver más de un valor. Habíamos visto que una función era como un procedimiento, pero además devolvía un valor (pero sólo uno). Si queremos obtener más de un valor de salida, una de las formas de hacerlo es pasándolos como parámetros, precedidos por la palabra "var".
Procedimientos con parámetros (3).
El programa quedaría:
 
{--------------------------}
{ Ejemplo en Pascal: }
{ }
{ Segundo proc. que }
{ modifica variables }
{ PROCMOD2.PAS }
{ }
{ Este fuente procede de }
{ CUPAS, curso de Pascal }
{ por Nacho Cabanes }
{ }
{ Comprobado con: }
{ - Turbo Pascal 7.0 }
{ - Turbo Pascal 5.0 }
{ - Surpas 1.00 }
{--------------------------}
 
program PruebaDeParametros2;
 
var dato: integer;
 
procedure modifica( var variable : integer);
begin
variable := 3 ;
writeln( 'Dentro: ', variable );
end;
 
begin
dato := 2;
writeln( 'Antes: ', dato );
modifica( dato );
writeln( 'Después: ', dato );
end.
 
 
Esta vez la última línea del programa sí que escribe un 3 y no un 2, porque hemos permitido que los cambios hechos a la variable salgan del procedimiento (para eso hemos añadido la palabra "var"). Esto es pasar un parámetro por referencia.
 
El nombre "referencia" alude a que no se pasa realmente al procedimiento o función el valor de la variable, sino la dirección de memoria en la que se encuentra, algo que más adelante llamaremos un "puntero".
 
Una de las aplicaciones más habituales de pasar parámetros por referencia es cuando una función debe devolver más de un valor. Habíamos visto que una función era como un procedimiento, pero además devolvía un valor (pero sólo uno). Si queremos obtener más de un valor de salida, una de las formas de hacerlo es pasándolos como parámetros, precedidos por la palabra "var".
Procedimientos con parámetros (4).
Y como ejercicio queda un caso un poco más "enrevesado". Qué ocurre si el primer programa lo modificamos para que sea así:
 
{--------------------------}
{ Ejemplo en Pascal: }
{ }
{ Tercer proc. que }
{ modifica variables }
{ PROCMOD3.PAS }
{ }
{ Este fuente procede de }
{ CUPAS, curso de Pascal }
{ por Nacho Cabanes }
{ }
{ Comprobado con: }
{ - Turbo Pascal 7.0 }
{ - Turbo Pascal 5.0 }
{ - Surpas 1.00 }
{--------------------------}
 
program PruebaDeParametros3;
 
var dato: integer;
 
procedure modifica( dato : integer);
begin
dato := 3 ;
writeln( 'Dentro: ', dato );
end;
 
begin
dato := 2;
writeln( 'Antes: ', dato );
modifica( dato );
writeln( 'Después: ', dato );
end.
 
=Argumentos variables=