Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: cobein en Marzo 25, 2013, 03:18:08 pm
-
Ejecuten el codigo y vean lo que pasa...alquien tiene idea de porque hace eso?
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
-
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!!!
-
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 (http://stackoverflow.com/questions/10262186/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
-
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
-
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
-
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
-
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
-
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.