Programación General > Visual Basic para principiantes

 Encuentra el error

<< < (5/5)

Nebire:
El problema reside en que la 'X' es una variable, además es un integer, su valor es limitado, y lo que se espera es un elemento de referencia, en for each 'elemento', dicho elemento no es un valor sino una referencia, un puntero a la dirección de memoria,(el integer, tampoco tiene alcance para referenciar dicho puntero), esto es así, por que no sólo pueden ser alojados variables si no objetos, por ejemplo textbox, formularios, etc... y en el caso de las matrices si el grupo tiene elementos apunta al primer elemento. en el caso concreto usando paramarray podría perfectamente contener un integer, un textbox, una matriz de cadenas  un timer,etc... si intentas forzarlo verás que te saltará un error tal que 'No coinciden los tipos', por ejemplo al intentar forzarlo de esta manera:


--- Código: Visual Basic --- Function Suma(ParamArray vector())    Dim X As Integer    Dim Y As Integer     For Each v In vector   ' fíjate que v si es una variant y referencia perfectamente al elemento del grupo vector.       Y =  Y + cint(v)      ' aquí te marcará error diciendo que no coinciden los tipos.    Next v    Suma = YEnd Function  
puedes darte cuenta de su posición en memoria, para ver que por lo menos se necesita un long...


--- Código: Visual Basic --- Function Suma(ParamArray vector())    Dim X As Integer    Dim Y As Integer     For Each v In vector          msgbox varptr(v)    & "    Esta es la posición de memoria donde se encuentra el elemento 'vº' del vector... "       stop   ' cuando pare aquí, lee esto y pulsa 'F5' para probar lo que comento en la siguiente línea       Y =  Y + varptr(v)      ' ahora te dará un desbordamiento, ya que un valor menor puede forzarse en una variable mayor, pero no al revés en vb6 sin convertir datos    Next v    Suma = YEnd Function   
y para que lo veas más claro, copia y ejecuta este código paso a paso 'F8'

--- Código: Visual Basic --- Private Sub Form_Load()    Dim v()    Dim t As Timer    Dim p As PictureBox    Dim f() As Form        ReDim f(0 To 1)    ReDim v(0 To 9)        stop  ' nota como se va a tragar todo esto, un dato inmediato, un doble, un picturebox, un string, un timer, varios forms.... pulsa F8 para continuar.    v(0) = 3    v(1) = CDbl(3)    Set v(2) = p    v(3) = "Hola"    v(4) = 3    Set v(5) = t    Set f(0) = Form1:  Set f(1) = New Form1    Set v(6) = f(1)    set v(7)=f(0)    stop  ' nota que la siguiente línea dará error, deberás anteponerle SET (como ves en los casos anteriores) ya que su valor no es un tipo de datos genérico sino un objeto.    v(8)=v(6)    let v(9)=43    Call Suma(v)End Sub   Function Suma(ParamArray vector())    Dim Y As Double    Dim t As Variant            For Each v In vector        MsgBox VarType(v)        stop ' te ha dado el valor 8204  que son 8192= vbArray + 12 = vbVariant (array de variant), pulsa f8 para continuar...        t = v        MsgBox "La dirección de memoria de 't' es: " & VarPtr(t) & " y la de 'v' es: " & VarPtr(v)       MsgBox UBound(vector())    Next v    Suma = YEnd Function  

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa