Visual Basic 6

Características del lenguaje: Arrays

 

Revisión del 1/Sep/98


1.- Las funciones pueden devolver Arrays y los Arrays dinámicos se pueden asignar (1/Sep/98)

Los Arrays dinámicos, (es decir los que pueden cambiar el número de elementos), ahora se tratan de igual forma que las variables normales. Tanto las funciones como las propiedades pueden devolver arrays y se puede asignar un array a otro.

Veamos un par de ejemplos para "clarificar" esto:

Empezaremos asignando el contenido de un array a otro, los comentarios son lo suficientemente explicativos como para que lo entiendas, pero si no es así... (lo siento por tí... je, je)
De todas formas, te lo explico a grandes rasgos:
---Se declaran dos arrays dinámicos, (fíjate que no se le indica en la declaración el número de elementos que tendrá)
---En este ejemplo se han usado arrays de cadenas de caracteres, pero podrían ser de cualquier tipo, la única "obligación" es que los dos arrays deben ser del mismo tipo; es decir, no podemos asignar a un array de Strings, un array de Longs. Ni un array de Variant a un array de String, incluso si el contenido de los variants son cadenas; ya que Visual Basic producirá un error si los dos arrays usados no se han declarado del mismo tipo... tampoco iba a ser perfecto...
---Se asignan de la misma forma que se hacen con las variables normales, no es necesario usar SET ni nada de eso.
---El array que recibe los datos, tendrá el mismo número de índices que el original y con la misma numeración... Osea, si un array se dimensiona de 3 a 5, el que recibe los datos, también estaría dimensionado de 3 a 5; y daría error si se quisiera acceder a un elemento anterior o posterior... como en cualquier array normal.

'Asignar un array a otro
Private Sub cmdAsignarArrays_Click()
    Dim Array1() As String
    Dim Array2() As String
    Dim i As Long
    
    'Dimensionamos el primer array,
    'no es necesario indicar el elemento inferior.
    'pero se puede usar cualquier valor, como se suele
    'hacer con todos los arrays...
    '...al fin y al cabo es un array.
    ReDim Array1(1 To 10)
    
    'Un bucle para recorrer el array recién dimensionado
    'Si sabemos los índices, se puede usar:
    'For i = 1 To 10
    'Si vas a probar, de esta forma sólo tendrás que cambiar
    'los índices del ReDim
    For i = LBound(Array1) To UBound(Array1)
        'Le asignamos unos elementos de prueba
        Array1(i) = "Elemento " & i & " del array"
    Next
    
    'Asignamos al segundo array el contenido del primero
    Array2 = Array1
    'Lo mostramos en un Listbox
    With List1
        .Clear
        'Si sabemos los valores iniciales y finales,
        'podemos usarlo, pero de esta forma, siempre
        'tomaremos los elementos correctos del array
        For i = LBound(Array2) To UBound(Array2)
            'Lo añadimos al ListBox, para ver que "funciona"
            .AddItem "En Array2: " & Array2(i)
        Next
    End With
End Sub

Continuamos asignando a un array lo que devuelve una función.
También está comentado, pero un poco de explicación aclarará cualquier duda...

Lo primero es crear una función que devuelva un array:
---La declaración es igual que una función normal, la única diferencia, entre otras cosas para que el Visual Basic sepa que estamos tratando con una función especial, es usar un par de paréntesis después del tipo de datos. Por supuesto que se pueden indicar parámetros, como en cualquier función. Eso lo veremos después.
---La forma de asignar a un array lo que la función devuelve, se usa de igual forma que si fuese una función que devuelve sólo un valor. Por supuesto que la variable que recibe el valor de esa función debe ser un array.
---Las mismas observaciones que en el ejemplo anterior: El array al que se asignará lo que devuelva la función, TIENE que ser del mismo tipo que la función... ni siquiera vale usar Variant.

'Una función que devuelve un Array
Private Function DevuelveArray() As String()
    'Devuelve un array de tipo String.
    '
    'Fíjate que después del tipo se indican los paréntesis,
    'esto es necesario, para que Visual Basic sepa que lo que
    'se devuelve es un array.
    
    'Asignamos unos valores de ejemplo
    Dim i As Long
    'Hay que usar un array intermedio para asignar los valores.
    Dim tmpArray() As String
    
    'Redimensionamos el array temporal
    ReDim tmpArray(6)
    
    'Asignamos los valores de ejemplo.
    '---NO SE PUEDE USAR el nombre de la función,
    '   ya que daría error.
    For i = 0 To 6
        tmpArray(i) = "Valor " & i & " devuelto por una función"
    Next
    
    'Asignamos el array temporal al nombre de la función,
    'para que devuelva el array.
    'Esto es como normalmente se hace con todas las funciones.
    DevuelveArray = tmpArray
End Function


'Un ejemplo para asignar a un array lo que devuelva la función
Private Sub cmdAsignarDeFuncion_Click()
    'Dimensionamos un array que contendrá lo que devuelva
    'la función.
    Dim Array1() As String
    Dim i As Long
    
    'Asignamos el array de la función.
    'Aunque no es necesario indicar los parétesis,
    'prefiero hacerlo, entre otras cosas, porque así
    'se sabe que es una función.
    Array1 = DevuelveArray()
    
    'Asignamos al ListBox el contenido del nuevo Array.
    With List1
        .Clear
        'Esta es la mejor forma de recorrer el array,
        'así no tenemos porqué saber los índices del mismo.
        For i = LBound(Array1) To UBound(Array1)
            .AddItem Array1(i)
        Next
    End With
End Sub

En este ejemplo, se usan parámetros, incluso opcionales... como toda función que se precie.
Lo dicho, si no entiendes los comentarios... espera a tener el VB6 y podrás probarlo...

'Función que devuelve un array y acepta parámetros, incluso opcionales
Private Function DevuelveArrayParametros(ByVal iVeces As Integer, _
            Optional ByVal sCadena As String = "Prueba") As String()

    'Devuelve un array de tipo String.
    
    'Asignamos unos valores de ejemplo
    Dim i As Long
    'Hay que usar un array intermedio para asignar los valores.
    Dim tmpArray() As String
    
    'Redimensionamos el array temporal
    ReDim tmpArray(iVeces)
    
    'Asignamos los valores de ejemplo.
    For i = 0 To iVeces
        tmpArray(i) = "Valor del índice: " & i & ", " & sCadena
    Next
    
    'Asignamos el array temporal al nombre de la función,
    'para que devuelva el array.
    'Esto es como normalmente se hace con todas las funciones.
    DevuelveArrayParametros = tmpArray
End Function


'Usamos la función que requiere parámetros
Private Sub cmdAsignarFuncionParametros_Click()
    'Dimensionamos un array que contendrá lo que devuelva
    'la función.
    Dim Array1() As String
    Dim i As Long
    
    'Asignamos el array de la función.
    'Aunque no es necesario indicar los parétesis,
    'prefiero hacerlo, entre otras cosas, porque así
    'se sabe que es una función.
    Array1 = DevuelveArrayParametros(10, "Con parámetros")
    
    'Asignamos al ListBox el contenido del nuevo Array.
    With List1
        .Clear
        'Esta es la mejor forma de recorrer el array,
        'así no tenemos porqué saber los índices del mismo.
        For i = LBound(Array1) To UBound(Array1)
            .AddItem Array1(i)
        Next
    End With
End Sub

Para terminar con esto de los arrays,
vamos a ver cómo asignar a un array del tipo Variant cualquier tipo de array.

Te preguntarás que porqué antes dije que no se podía asignar un array de un tipo a otro array de otro tipo, incluso si es Variant.
Y no te engañaba... NO SE PUEDE ASIGNAR UN ARRAY QUE NO SEA VARIANT A UN ARRAY DEL TIPO VARIANT.
Pero lo que si se puede hacer es asignar a un elemento de un array de tipo Variant un array de cualquier tipo, incluso se pueden mezclar en los distintos elementos de ese array variant diferentes tipos de arrays... pero esto no es nada nuevo... antes también se podía hacer... salvo que no se podía asignar de una vez un array completo.
Veamoslo con un ejemplo:

'
Private Sub cmdAsignarAVariant_Click()
    Dim intArray() As Integer
    Dim strArray() As String
    Dim varArray() As Variant
    Dim i As Long, j As Long
    
    'Array con datos del tipo Integer
    ReDim intArray(3)
    For i = 0 To 3
        intArray(i) = i + Int(Rnd * 10)
    Next
    
    'Array con datos del tipo String
    ReDim strArray(4)
    For i = 0 To 4
        strArray(i) = "Array de String, elemento: " & i
    Next
    
    'Un Array del tipo Variant
    ReDim varArray(1 To 2)
    
    'Asignamos a un elemento del array de Variants
    'el contenido de un array completo.
    varArray(1) = intArray()
    varArray(2) = strArray()
    
    'Mostramos el contenido del array de Variants
    With List1
        .Clear
        'Bucle para cada elemento del array Variant
        For j = LBound(varArray) To UBound(varArray)
            .AddItem "Array " & j
            .AddItem "--------"
            'Recorremos cada elemento de los arrays asignados
            For i = LBound(varArray(j)) To UBound(varArray(j))
                'Mostramos los datos, indentados con un TABulador
                .AddItem vbTab & varArray(j)(i)
            Next
        Next
    End With
End Sub

Características del lenguaje   Visual Basic 6: Nuevas características

ir al índice