Programación General > Visual Basic para principiantes
Encuentra el error
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
[*] Página Anterior
Ir a la versión completa