martes, 10 de julio de 2012

Paso de parámetros por valor o por referencia.


Cuando queremos pasar un parámetro a un procedimiento,podemos hacerlo de dos maneras. La manera habitual de saber como se pasan los parámetros es fijarnos en el procedimiento o función que recibe el parámetro

Imaginar una rejilla, en la que hay celdas que contienen nuestras variables.
Cada celda es una dirección en la memoria de nuestro ordenador, con
un contenido con valor o vacío


Por valor:

Cuando pasamos por valor una variable a un procedimiento,no pasamos la
variable original,pasamos una copia de esta.(No sería la celda original).

La ventaja es que si dentro del procedimiento se cambiase el valor de la variable,al salir del procedimiento, nuestra variable contendrá su valor inicial.

En Gambas1 y Gambas2 solo era posible pasar parámetros por valor.

----código----
PUBLIC SUB Form_Open()

Dim sNombre AS String

sNombre=”Jose Luis”

'Llamamos al procedimiento, pasándole como parámetro la variable sNombre

VerNombre(sNombre)

'Al salir del procedimiento ,mostramos el valor de la variable sNombre,
'comprobando que no ha cambiado.

Message.info(“El valor del nombre es: “ & sNombre)

End


PUBLIC SUB VerNombre(sNom AS STRING)

'Vemos su valor original.

Message.info( “El valor original del parámetro es: “ & sNom)

'Cambiamos su valor y lo mostramos.

sNom=”Jose María”

Message.info(“El valor del parámetro se cambia a: “ & SNom)

END

---código---

No olvidéis cambiar el tipo de comillas al pegarlo en el editor de Gambas. ;-)


Por referencia:

Cuando pasamos un parámetro por referencia,estamos pasando el contenido
de la celda de memoria donde se encuentra el valor de nuestra variable.
Así que el procedimiento no manejara una copia de nuestra variable,
sino la variable original.

En la versión de Gambas3 podemos usar el paso de parámetros por referencia.
Para ello, debemos usar en la llamada al procedimiento la palabra ByRef
Y también debemos incluirla dentro de los parámetros del procedimiento
al que llamamos.


---código---
PUBLIC SUB Form_Open()

Dim sNombre AS String

sNombre=”Jose Luis”

'Llamamos al procedimiento, pasándole como parámetro la variable sNombre

VerNombre(ByRef sNombre)

'Al salir del procedimiento ,mostramos el valor de la variable sNombre,
'comprobando que ha cambiado.

Message.info(“El valor del nombre es: “ & sNombre)

End


PUBLIC SUB VerNombre(ByRef sNom AS STRING)

'Vemos su valor original.

Message.info( “El valor original del parámetro es: “ & sNom)

'Cambiamos su valor y lo mostramos.

sNom=”Jose María”

Message.info(“El valor del parámetro se cambia a: “ & SNom)

END
---código---

Otro ejemplo usando paso de parámetro por referencia.
No dividir por cero o dará error. ;-)

---código---
'Algoritmo que calcula el cociente y el resto de la división haciendo que estos resultados
'sean devueltos al algoritmo principal

Public Sub Form_Open()
Dim dividendo, divisor, cociente, resto As Integer

dividendo = InputBox("Ingrese el valor del dividendo")
divisor = InputBox("Ingrese el valor del divisor")

division(dividendo, divisor, ByRef cociente, ByRef resto)

Message.Info("Cociente: " & cociente & "\n" & "Resto: " & resto)

End

'Cabecera: division(Entrada divi,Entrada d,Salida c,Salida r)
'Precondición: dividendo >= divisor y ambos son mayores que 0
'Postcondición: devuelve a través de los parámetros de salida c y r, el cociente y el resto.


Public Sub division(divi As Integer, d As Integer, ByRef c As Integer, ByRef r As Integer) As Integer

c = divi Div d
r = divi Mod d

End

---código---
Como veis en la función división, tenemos paso por valor y referencia.
Espero que les sea útil.

1 comentario: