CyM98

<< Parámetros por valor o por referencia >>

En la mayoría de los lenguajes hay dos formas de pasar las variables a una función, por valor o por referencia.

  • Por valor significa que la función (o subrutina) recibe sólo una copia del valor que tiene la variable, o sea que no la puede modificar.
  • Por referencia significa que se pasa la posición de memoria donde esta guardada la variable, por lo que la función puede saber cuánto vale, pero además puede modificarla de cualquier manera.

Sin embargo toda esta diferencia queda escondida casi totalmente por el compilador, por lo que uno puede pasarse media vida programando sin darse cuenta de esto.

   
Google
Web www.oma.org.ar

En Quick Basic (QB/QBasic/...) sólo se puede pasar las variables por referencia. En muchos otros lenguajes ( C++/Pascal/Delphi/VB/ ...) se puede elegir, según se necesite. Como todo esto esta escondido por los compiladores entonces en general uno no se preocupa demasiado (a menos que se estén llamando a rutinas externas, por ejemplo de Windows). Lo grave es que en algunos casos produce errores muy difíciles de detectar.

QB:

En QB siempre se pasan los parámetros a funciones y subrutinas internas por referencia. Por eso en los casos problemáticos es necesario hacer una copia del valor de la variable recibida.

Recién en VB5 y VB6 se puede usar la palabra ByVal para pedir que los parámetros se pasen por valor, y también se puede usar ByRef para indicar explícitamente que se los quiere pasar por referencia. En este caso se pueden escribir:

  • Por valor(no anda en QB):
    Function FijateSiEsCincoVal(ByVal x)
  • Por referencia(explícitamente, tampoco anda en QB)
    Function FijateSiEsCincoRef(ByRef x)
  • Por referencia(automáticamente, única opción en QB):
    Function FijateSiEsCincoVal( x)

Pascal:

El Pascal pasa normalmente los parámetros a funciones y subrutinas internas por valor. Se puede pedir que los pase por referencia agregando var antes de los nombres de los parámetros.

  • Por valor:
    Function FijateSiEsCincoVal(x:Integer):Integer;
  • Por referencia:
    Function FijateSiEsCincoRef(var x:Integer):Integer;

C/C++:

Las distintas versiones de C pasan normalmente los parámetros a funciones y subrutinas internas por valor. Se puede pedir que los pase por referencia utilizando &. Otra forma de lograr lo mismo es usando punteros, para manejar la dirección de memoria de las variables directamente.

  • Por valor:
    int FijateSiEsCincoVal(int x);
  • Por referencia:
    int FijateSiEsCincoRef(int &x);

Ejemplos:

Para ver el tipo de cosas que se pueden hacer y el tipo de cosas raras que pueden aparecer les ponemos dos ejemplos.

Fijate Si es Cinco Comp.
Hay una función que se fija si el número es igual a cinco. Pero después de fijarse lo cambia por un numero al azar destruyendo completamente el valor de la variable. Esto es parecido a lo que pasa al calcular el DCM en algunas de las funciones que vimos. La diferencia es que acá alteramos a propósito el valor de los parámetros, en cambio en el otro caso las cuentas auxiliares eran las que sin querer afectaban los números.

Incrementar Variable Comp.
Este ejemplo es un poco más útil y sirve para incrementar en uno el valor de una variable (de la misma manera que el inc de Pascal o el ++ de C). En este caso se modifican a propósito los valores para obtener el efecto buscado.

Intercambiar Variables (Comp.)
Otro ejemplo clásico es el de intercambiar el valor de dos variables (como el Swap de QB). Por ahora éste queda de ejercicio.


Lecciones relacionadas:

Divisor común mayor factorizando Comp. Mate. Mate.

Algoritmo de Euclides Comp. Comp. Mate. Mate.

 


Comentarios, preguntas, sugerencias:

Agregar tercer ejemplo

Nombre y apellido (opcional):

E-mail (opcional):

    


OmaNet   Curso CyM98 OmaNet - Educación Interactiva
   
www.oma.org.ar/omanet | omanet@oma.org.ar
mensajes: webmaster@oma.org.ar
duty free booze duty free cigarette buy cigars duty free cosmetics duty free prices buy duty free perfume online duty free tobacco buy online