Saltar al contenido

Parámetros pasados a una subrutina como ByRef


Antoni

Recommended Posts

publicado

Hola:

Tras leer este artículo ByVal or ByRef Parameters proporcionado por nuestro amable "BigBoss" Proper, me he puesto a jugar un poco, y se me han puesto los pelos como escarpias.

Ya tenía mas o menos claro la diferencia entre pasar los parámetros como ByRef o pasarlos como ByVal.

Pero lo que no tenía nada claro es que los parámetros son posicionales.

Pero lo mas terrorífico que he descuebierto es que, al ser los parámetros posiciones, los nombres de las variable no se utilizan absolutamente para nada, y por ello si dentro del procedimiento Llamado modificas el valor de uno de los parámetros por ejemplo el nº 3, quedará modificada la variable que pasamos en tercer lugar con independencia del nombre que tenga.

Aquí os dejo un ejemplo de todo este rollazo que os he soltado, y espero que a alguien también le sirva para aclarar algúna cosa.

Sub Llamador()
Pepe = 1
Juan = 2
Llamado Pepe, Juan
Debug.Print Pepe, Juan
End Sub

Sub Llamado(ByRef Juan, ByRef Pepe)
Debug.Print Juan, Pepe
Juan = 3
Pepe = 4
End Sub
[/CODE]

Observad que cuando modificamos el valor de la variable Juan en el procedimiento Llamado, realmente estamos modificando la variable Pepe del procedimiento Llamador.

Saludos.

publicado

Hola Antoni

Recuerdo que eso me dio mucha lata cuando lo estudié en C++ en primero de carrera. No el concepto en si de "por referencia" y "por valor", sino que luego venían los punteros y luego se hacia un coktel de llamadas con todo y había que tenerlo muy claro para no hacerse un lio.

Según tengo entendido, por omisión, en VB las variables se pasan como referencia. Pasar algo como referencia significa asignarle la dirección de memoria de la variable pasada como parámetro a la variable de la función que es llamada, por lo que aun que se llame Pepe Juan o Antonio, ambas acceden a la misma posición de memoria, de ahí la palabra referencia, "hace referencia a". Por valor, ByVal, simplemente hace una copia de la variable pasada como parámetro en la variable de la función que es llamada, de modo que al ser una copia, nunca podrá alterar el valor de la variable pasada como parámetro.

En el de tu ejemplo:

Sub Llamador()
Pepe = 1
Juan = 2
Llamado Pepe, Juan
Debug.Print Pepe, Juan
End Sub

Sub Llamado(ByRef Juan, ByRef Pepe)
Debug.Print Juan, Pepe
Juan = 3
Pepe = 4
End Sub
[/CODE]

Suponiendo " Llamado Pepe, Juan" que Pepe apunta a "007E4025", Juan va a referirse a "007E4025", y en ningún caso es la misma variable, simplemente apuntan a la misma dirección.

Por esto hay que tener mucho cuidado con el nombre que se le dan a las variables, ya que uno puede terminar loco si se hace lo del ejemplo que has puesto.

Un saludo

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.