Arrays ????
Rápido um dicionário !!!
Uhn... Vejamos...
Arrays - Tipo de variável que armazena um conjunto de valores do mesmo tipo ; Um arranjo de elementos em
uma ou mais dimensões ; Uma coleção de elementos do mesmo tipo no qual a posição de cada elemento está
definida de forma única por um inteiro.
Obs: Os arrays são semelhantes aos vetores , se você já ouviu falar em vetores e conhece algo sobre eles
verá que os conceitos envolvidos são semelhantes.
Acho que não foi um bom começo , mas , vamos tentar melhorar.
Vamos supor que você precise atribuir a três variáveis o nome de três pessoas que constam de uma relação.
Como você faria ? Ora, ora... abaixo as três etapas básicas envolvidas no tedioso processo...
snome1="João da Silva
dim snome1 as string for i=1 to 3
snome2="Maria Lima"
dim snome2 as string msgbox snome & i
snome3="Pedro
dim snome3 as string Next
Sabino"
declarando as exibindo o conteúdo
atribuindo valores
variáveis das variáveis
Você teve que declarar 3 variáveis diferentes , uma para armazenar cada nome, mesmo cada nome sendo do
uma variável do tipo string.
Muito Bem, e se a relação tiver 5 pessoas e você precisar atribuir os nomes a variáveis ??? Ô Loco !!!!
sNomes(1)="João da
Silva"
sNomes(2)="Maria
Lima"
for i=1 to 5
Dim sNomes(1 to 5) as sNomes(3)="Pedro
msgbox snomes(i)
String Sabino"
Next
sNomes(4)="Marcia de
Souza"
sNomes(5)="Carlos
Manga"
declarando as exibindo o conteúdo
atribuindo valores
variáveis das variáveis
O que há de novo ?
Tudo se passa como se você tivesse um "armário" com 5 "gavetas " , cada gaveta possuindo um número de
identificação , e armazenando um nome distinto.
Conclusão :
1. Os Arrays permitem que definamos uma série de variáveis pelo mesmo nome diferenciando-as através
de um número inteiro chamado índice.
2. Todos os elementos de um array devem ser do mesmo tipo de dado: string , integer, etc.... ( para que os
elementos possam conter diferentes tipos de dados (strings , integers, objects, etc...) você deve definir o array
como do tipo Variant )
3. A quantidade de variáveis definidas por cada índice (número) determina o tamanho do array.
Ao declarar um array da seguinte forma: Dim Teste(4) o array possuirá 5 elementos pois o primeiro
elemento terá como índice o número zero. Assim : Teste(0) ,Teste(1), Teste(2), Teste(3) , Teste(4)
Para fugir a esta característica basta você definir o índice inferior e superior do array , assim : Dim Teste(1
to 5) irá produzir :Teste(1) ,Teste(2), Teste(3), Teste(4) , Teste(5)
O VB trabalha com dois tipos de arrays : os fixos , que sempre permanece do mesmo tamanho e os
dinâmicos cujo tamanho pode ser alterado em tempo de processamento.
Arrays Fixos
A sintaxe para declarar um array fixo é:
Onde:
Dica - Um laço For/Next é uma das maneiras mais tradicionais de percorrer os elementos de um array e de
atribuir valores a um array. geralmente usamos a sintaxe abaixo:
For i=
For i=
indice_inferior to
indice_inferior to
indice_superior
indice_superior
Print
Nome_do_vetor(i)
Nome_do_vetor(i)
= Variável
Next i
Next i
atribuindo valores percorrendo o
array
Obs: A partir do VB5 temos também o laço For Each ...Next , o qual é específico para ser usado com coleções
e arrays. A sintaxe é:
Vejamos um exemplo:
Dim nRandom() As Integer
Dim Elemento As Variant
Dim nTamanhoArray as integer
Randomize
Redim nRandom(nTamanhoArray)
Podemos declarar um array fixo das seguintes formas com relação a visibilidade do mesmo no projeto:
Escopo Visibilidade
Local uma variável definida a nível de procedure só é visível
dentro da procedure onde foi declarada
Módulo uma variável declarada na General Declaration de
/Formulário um módulo ou de um formulário só é visível para
todas as procedures dentro do módulo ou formulário
onde foram declaradas
Público uma variável declarada em um módulo como Public é
visível em todas as procedures de seu projeto
Ao declarar um array você não pode exceder o intervalo do tipo de dados Long ( -2.147.483.648 to
-2.147.483.647) . Um número muito grande pode consumir muita memória. Por exemplo:
Cada elemento do seu array vai ser do tipo Long ; cada variável Long ocupa 4 bytes de memória
O array Teste precisará de 80.004 bytes de memória (20.001 x 4 ). Você acha pouco ????
Se você tiver 10 vetores idênticos no seu projeto terá consumido 800.040 bytes de memória.
'contadorA()
MsgBox arrX(1)(0) 'exibe o elemento de cada array
MsgBox arrX(1)(1)
MsgBox arrX(1)(2)
' contadorB()
MsgBox arrX(2)(0)
MsgBox arrX(2)(1)
MsgBox arrX(2)(2)
End Sub
Entendendo:
1. Primeiro declaramos o vetor ContadorA como do tipo inteiro com 3 elementos e atribuímos os números
0 , 1 e 2 ao array
2. A seguir declaramos o vetor ContadorB como do tipo String com 3 elementos e atribuímos os números
Elemento - 0 ,Elemento - 1 e Elemento - 2 ao array
3. Finalmente declaramos o vetor arrX(2) como sendo do tipo Variant e atribuímos os vetores declarados
anteriormente como sendo elementos deste vetor. (Arrx(1)=contadorA() e ArrX(2)=ContadorB())
4. Para exibir os elementos do vetor usamos um índice para identifica o elemento do vetor e outro índice
que identifica o elemento do vetor que foi atribuído . Assim temos:
'contadorA()
MsgBox arrX(1)(0) == > 0
MsgBox arrX(1)(1) == > 1
MsgBox arrX(1)(2) == > 2
' contadorB()
MsgBox arrX(2)(0) == > Elemento - 0
MsgBox arrX(2)(1) == > Elemento - 1
MsgBox arrX(2)(2) == > Elemento - 2
Para determinar os limites inferiores e superiores de um array podemos usar as funções UBound e LBound.
Assim:
LBound - Retorna um valor do tipo Long contendo o MENOR índice para a dimensão definida de um array.
Sintaxe: LBound(nome_do_array[, dimensão])
Parte Descrição
nome_do_array Nome do Array. Obrigatório
dimensão Opcional; Variant (Long). Indica qual a dimensão para qual o menor índice é retornado.Se
for omitido o padrão é 1.
UBound - Retorna um valor do tipo Long contendo o MAIOR índice para a dimensão definida de um array.
Sintaxe: LBound(nome_do_array[, dimensão])
Parte Descrição
nome_do_array Nome do Array. Obrigatório
dimensão Opcional; Variant (Long). Indica qual a dimensão para qual o MAOIR índice é retornado.Se
for omitido o padrão é 1.
Exemplo:
Dim Superior
Dim MeuArray(1 To 10, 5 To 15, 10
To 20) ' declara arrays
multidimensional , no caso 3
dimensoes
Dim QualquerArray(10)
Os arrays são muito usados para preencher Listas e controles como ListBox/ComboBox/ListView,etc. e
podemos usá-los também para serem preenchidos com o conteúdo de um Recordset. Para ilustrar isto
vejamos o exemplo a seguir que usa o método GetRows para armazenar em um vetor os dados de uma
tabela:
rs.Close
Set rs = Nothing
db.Close
numero_de_colunas = UBound(dbvetor, 1)
numero_de_registros = UBound(dbvetor, 2)
'Preenche o grid
For i = 0 To numero_de_registros
For j = 0 To numero_de_colunas
linha = linha & dbvetor(j, i) & Chr(9)
Next j
Grid1.AddItem linha
linha = ""
Next i
End Sub
Estamos retornando em numero_de_colunas o maior valor do índice para a primeira dimensão: Ora este é o
valor relacionado a quantidade de campos selecionado e estamos retornando em numero_de_registros o
maior valor para índice da segunda dimensão que é o valor relacionado com a quantidade de registros.
Outro exemplo de utilização seria o preenchimento de ListBox ou ComboBox com o conteúdo de um array
usando as propriedades UBound e LBound. Vejamos a seguir:
Arrays Multidimensionais
Podemos declarar arrays de mais de uma dimensão; fazemos isto informando outro valor para o índice que
comporá a outra dimensão.A sintaxe para a declaração é a mesma da usada nos arrays unidimensionais. Assim
temos:
Declara um array com 5 elementos em duas dimensões(Lembre-se que o índice inferior inicial é sempre zero).
Desta forma o vetor pode ser entendido como uma tabela com 5 linhas e 5 colunas. A primeira dimensão ,
representando as linhas são identificadas pelos índices de 0 a 4 e a segunda dimensão seriam as colunas
identificadas pelos índices de 0 a 4. O total de elementos do array será 25 elementos ( 5 x 5 ).
Assim:
Declara um array com 5 elementos em cada dimensão. Aqui estamos tratando com a noção de volume (
Altura, Largura , Profundidade) - imagine em um cubo. O total de elementos deste array será 125 ( 5 x 5 x 5 ).
Podemos identificar os elementos da seguinte forma:
Tres_Dimensoes(0,0,0)
Tres_Dimensoes(1,1,1)
Tres_Dimensoes(2,1,0)
Abaixo temos uma representação gráfica simplificada de como seria a terceira dimensão.
Você , ao declarar um array multidimensional , pode definir o índice inicial e final para cada dimensão usando
a palavra chave To, então para o caso acima teríamos:
Para percorrer ou atribuir valores para arrays multidimensionais os laços For/Next são muito úteis. Vejamos
abaixo um exemplo de como preencher um array bidimensional :
Static MatrixA(1 To 10, 1 To 10) As Double ' define um array bidimensional com 100 elementos
Arrays Dinâmicos
Pode acontecer que num determinado momento você não saiba exatamente qual o tamanho do seu vetor, ou
pode acontecer também que após você definir um array com um tamanho ter que alterar o este tamanho quer
aumentando quer diminuindo. Como fazer isto ????
Para resolver estes problemas usamos os arrays dinâmicos , eles podem ser redimensionados a qualquer
momento , além de permitir um gerenciamento de memória mais amigável , pois você pode usar um array
definido para uma quantidade de elementos muito grande num momento e após usá-lo poderá liberar a
memória usada por ele redimensionando-o para quantidades menores de elementos.
Para criar um array dinâmico basta declarar o array sem definir os índices inferiores e superiores das
dimensões., isto é, você não define o tamanho do array .Exemplo: Dim Nomes() as String
Para alocar o número atual de elementos do array você deve usar a declaração ReDim. Assim
Então primeiro você declara o array (Dim) e define o seu tamanho em seguida para , se for o caso,
redimensioná-lo usando a declaração ReDim. Vejamos um exemplo:
ReDim Preserve
MyArray(15) ' Redimensiona
o array para 15 elementos
For I = 1 To 15
Debug.Print MyArray(I) '
exibe o conteudo do array
Next I
End Sub
Dim MyArray() As
Integer ' Declare um
array dinamico
ReDim
MyArray(5) '
Aloca 5 elementos
For I = 1 To 5
MyArray(I) =
I ' Inicializa o
array
Next I
For I = 1 To 5
Debug.Print
MyArray(I) 'exibe o
conteudo do array
Next I
Declaramos o array dinâmico e a seguir alocamos 5 elementos para o array, a seguir atribuímos valores a cada
elemento do array e exibimos o resultado que será : 1 , 2 , 3 , 4 e 5
Redimensionamos o array para 10 elementos e exibimos a seguir o conteúdo do mesmo. Aqui vamos observar
que o resultado será: 0,0,0,0,0,0,0,0,0,0 , ou seja o conteúdo do array que antes era 1,2,3,4,5 foi perdido.
Atribuímos então novos valores aos elementos do array e exibimos o resultado que será : 1,2,3,4,5,6,7,8,9 e 10.
ReDim Preserve
MyArray(15) ' Redimensiona
o array para 15 elementos
For I = 1 To 15
Debug.Print MyArray(I) '
exibe o conteudo do array
Next I
Aqui redimensionamos novamente o array , agora usando a palavra chave Preserve , para 15 elementos e a
seguir exibimos o conteúdo do array. O resultado será: 1,2,3,4,5,6,7,8,9 , 10 ,0 ,0 ,0 ,0, 0 , ou seja o conteúdo
anterior foi preservado e os novos elementos incluídos com valores 0. (valores numéricos são inicializados com
zero , strings com comprimento zero ("") , variant com vazio (empty)
Conclusão:
Ao redimensionar um array usando a palavra chave ReDim o conteúdo do array será perdido . Para evitar tal
efeito devemos usar a palavra Preserve na declaração. Ex: RedDim Preserve Teste(1 To 15) As Integer
Você pode usar a declaração ReDim repetidamente para alterar o numero de elementos e dimensões de um
array. Porem você não pode declarar um array de um tipo de dados e mais tarde usar a declaração Redim
para alterar o tipo de dados a menos que o tipo de dados usado foi o Variant, neste caso a alteração pode ser
feita usando a cláusula As.
Ao usar a palavra chave Preserve , você pode redimensionar somente a última dimensão do array você não
pode alterar o número dimensões. Assim se você usou um array com uma dimensão , você pode alterar a
dimensão , mas se você usou um array com duas dimensões você somente pode alterar a última dimensão e
ainda preservar o conteúdo do array.
Exemplo: ReDim X(10, 10, 10) ==> ReDim Preserve X(10, 10, 15)
Quer aprender C# ??
Referências: