Autor Tema: El misterio del ByRef  (Leído 5483 veces)

0 Usuarios y 1 Visitante están viendo este tema.

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
El misterio del ByRef
« en: Marzo 25, 2013, 03:18:08 pm »
Ejecuten el codigo y vean lo que pasa...alquien tiene idea de porque hace eso?

Código: [Seleccionar]
Option Explicit

Private Sub Form_Load()
    Dim sVal As String

    sVal = "123123"
    Test (sVal)
    Debug.Print sVal

    sVal = "123123"
    Call Test(sVal)
    Debug.Print sVal

    sVal = "123123"
    Test sVal
    Debug.Print sVal

End Sub

Private Function Test(ByRef sVal As String)
    sVal = "ByRef"
End Function

79137913

  • Megabyte
  • ***
  • Mensajes: 185
  • Reputación: +21/-4
  • 4 Esquinas
    • Ver Perfil
    • Eco.Resumen Resumenes Cs. Economicas
Re:El misterio del ByRef
« Respuesta #1 en: Marzo 25, 2013, 03:46:14 pm »
HOLA!!!

Tengo una leve idea de por que sucede eso...

1er caso:
Como la funcion no esta igualada a nada el compilador debe quitar esta llamada del programa final.

2do caso:
El uso de Call sirve para llamar y  asegurar la ejecucion de una funcion o sub, por ende el compiador no quita esa parte del codigo.

3er caso:
no tengo idea.

AUNQUE:
Hice testeos y verifique que al agregar la instruccion Debug.Print "hola" a la funcion test, esta se imprimia 3 veces por lo que el compilador si llama a la funcion en el primer lugar.

Por ende no tengo idea lo que esta pasando y por eso nunca uso byref XD

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

 79137913                          *Shadow Scouts Team*                                                          Resumenes Cs.Economicas

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:El misterio del ByRef
« Respuesta #2 en: Marzo 25, 2013, 04:30:18 pm »
Fijate lo que pasa agregando un debug.print al final de la funcion Test

Para más info: StackOverflow - VB6 pass by value and pass by reference

En sintesis (no se si esta explicado ahí arriba x'D): Con los parentesis estas obligando a vb a analizar esa expresion primero, como es una variable, no devuelve la variable en si, sino una variable creada al vuelo (en el parentesis puede haber alguna funcion, o strings separados por "&" y ahí si habria diferencia), por lo que despues de llamar a la funcion no tenes acceso a esa variable "anonima"

Explicado con codigo

Test "Hola" & "Como estas"

vb primero crea un string juntado esas 2 cadenas, en una variable inventada al momento y se lo pasa a la funcion, despues no tenes forma de como acceder a "Hola" & "Como estas" sin hacer copy paste :P porque no lo tenes en una variable declarada, la hardcodeaste ahí al voleo
« última modificación: Marzo 25, 2013, 04:36:39 pm por raul338 »

erbuson

  • Kilobyte
  • **
  • Mensajes: 75
  • Reputación: +11/-1
    • Ver Perfil
Re:El misterio del ByRef
« Respuesta #3 en: Marzo 25, 2013, 06:02:11 pm »
Efectivamente amigo raul, es por el paréntesis, tal como se explica tambien en la msdn
 en como Forzar un argumento para que pase como un valor.

http://msdn.microsoft.com/es-es/library/chy4288y(v=vs.80).aspx

Saludos


cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:El misterio del ByRef
« Respuesta #4 en: Marzo 25, 2013, 08:54:35 pm »
Muy interesante, la verdad utilizo muy poco parametros ByRefy me tope con esto de casualidad, es bueno tenerlo presente porque puede provocar un error dificil de encontrar.

Gracias por la data!

Saludos

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:El misterio del ByRef
« Respuesta #5 en: Marzo 26, 2013, 10:45:35 am »
muy bueno, muchas gracias.

Si no me equivoco en el vb6 si no indicamos si es ByVal o byRef, por default toma ByRef.
Y en .net en cambio, por default toma ByVal

wolf_kof

  • Visitante
Re:El misterio del ByRef
« Respuesta #6 en: Marzo 26, 2013, 01:13:18 pm »
ByVal es "por valor". Tú pasas un número, y el número se copia y se usa en la función. Si modificas el número, lo harás en la función.

ByRef es "por referencia". Las referencias son instancias de la misma variable. Es como la misma variable usada en muchos lugares. Por tanto si la modificas en la función, lo harás en el resto del programa.

aqui tienes dos ejemplos q me han ayudado a mi:

Código de ejemplo ByVal

Private Sub Command1_Click()
Dim Un_Valor As Long
Un_Valor = 100
'Se envía la variable por Valor ( ByVal )
Call Sumar(Un_Valor)
'Muestra el valor que es 100, ( no se modificó en la función Sumar )
MsgBox Un_Valor
End Sub

Sub Sumar(ByVal Valor As Long)
'Modifica la variable
Valor = Valor + 100

End Sub



Código ByRef

Private Sub Command1_Click()
Dim Un_Valor As Long
Un_Valor = 100
'Se envía la variable por Referencia ( ByRef ) con el valor 100
Call Sumar(Un_Valor)
'Muestra el valor que ahora es 200, ( ya que se modificó en la Sub Sumar)
MsgBox Un_Valor
End Sub

Sub Sumar(ByRef Valor As Long)
'Modifica la variable
Valor = Valor + 100
End Sub

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:El misterio del ByRef
« Respuesta #7 en: Marzo 26, 2013, 02:11:05 pm »
Eso lo entiendo wolf_kof, el post trata de cualdo llamas a una funcion con un parametro byref entre parentesis, mira el ejemplo inicial para ver lo que digo.