PROGRAMMIAMO
VB - Vettori dinamici

Vettori dinamici

Non sempre si conosce a priori il numero di elementi di un vettore. Si pensi ad esempio a un programma per acquisire una serie di valori da tastiera e memorizzarli in un vettore. In questo caso il programmatore non può sapere in partenza qual è il massimo numero di valori che il vettore dovrà contenere.

Il VB permette di risolvere il problema dichiarando un vettore dinamico (detto così in contrapposizione con i vettori statici, che hanno dimensioni fisse). Si consideri il seguente esempio: l'utente inserisce in una casella di testo il numero di valori casuali che desidera generare. Il vettore viene dimensionato in base al valore contenuto nella casella di testo:

Private Sub cmd__click()

Dim Casuali() as Double 'dichiarazione del vettore (senza dimensioni)
Dim i as Integer
Dim numele as Integer

numele = Val(txtNumero.text)'acquisizione del numero di elementi

Redim Casuali(numele-1) 'dimensionamento del vettore da 0 a numele-1

For i=0 To numele-1 'ciclo di riempimento del vettore

Casuali(i) = Rnd

Next i

End Sub

Si noti come il vettore viene dapprima dichiarato senza indicarne le dimensioni e, dopo, venga dimensionato con una istruzione Redim. Il VB consente anche di omettere la dichiarazione Dim e di usare solo la Redim con i vettori dinamici, ma questa pratica non è consigliata al buon programmatore.

E' possibile ripetere l'istruzione Redim più volte sullo stesso vettore, cambiandone ogni volta le dimensioni a piacere (non è tuttavia possibile cambiare il tipo del vettore, cioè per esempio trasformare un vettore di Integer in un vettore di Double).

Si noti tuttavia che applicando l'operazione Redim a un vettore, i valori eventualmente contenuti nel vettore prima della Redim vengono cancellati. Se si vuole conservare i valori precedenti (come normalmente accade) occorre specificare Redim Preserve. Si consideri il seguente esempio in cui, a ogni clic su un command button, viene inserito un nuovo elemento in un vettore e il vettore stesso viene ridimensionato di conseguenza:

Dim Numeri() as Double
Dim ind as Integer

Private Sub cmdInsert_click()

Redim Preserve Numeri(ind)

Numeri(ind) = Val(txtNumero.text)

ind = ind + 1

End Sub

Numeri e ind sono dichiarati globali (fuori dalla subroutine) perchè devono conservare i valori fra una chiamata e l'altra della subroutine. Ind inizialmente viene inizializzato a zero e, la prima volta che viene premuto il bottone, il vettore è dimensionato con un solo elemento con indice zero. L'indice viene quindi incrementato e, alla successiva pressione del bottone, viene creato un nuovo elemento del vettore e così via...

Lbound e Ubound

Il VB fornisce due funzioni molto comode, che permettono di determinare l'indice minimo (quello del primo elemento) e l'indice massimo (quello dell'ultimo elemento) di un vettore: Lbound e Ubound. Usando queste due funzioni è possibile scrivere un ciclo che agisce sull'intero vettore senza doversi ricordare gli indici estremi del vettore stesso. Per esempio

For j = Lbound(Casuali) to Ubound(Casuali)

Media = Media + Casuali(j)

Next j

Si noti che Ubound e Lbound forniscono il numero (intero) corrispondente al primo e all'ultimo elemento validi del vettore. Tuttavia non è detto necessariamente che tali indici corrispondano agli elementi effettivamente riempiti nel vettore stesso. Per esempio in un vettore di 1000 elementi numerati da 0 a 999, potrebbe darsi il caso che siano stati riempiti solo i primi 300 elementi. Tuttavia Ubound in questo caso fornisce sempre il valore 999, indipendentemente dal fatto che il vettore sia stato riempito interamente oppure no.

Se un vettore non viene riempito completamente, indipendentemente dal fatto che si tratti di un vettore statico o dinamico, occorre memorizzare da qualche parte l'informazione relativa al numero di elementi effettivamente utilizzati. A tale scopo si può usare una variabile globale di tipo Integer (che verrà incrementata ad ogni ulteriore inserimento nel vettore). Alcuni programmatori utilizzano l'elemento zero di un vettore per memorizzare il numero di valori contenuti nel vettore; altri mettono un valore convenzionale dopo l'ultimo elemento valido (es. la stringa "zzzzzz" o un valore numerico negativo) per segnalare la "fine del vettore".

 

For ... Each

In VB esiste un altro modo per scrivere un ciclo che opera su tutti gli elementi di un vettore. Bisogna fare uso di una variabile di tipo Variant (cioè in grado di contenere qualsiasi tipo di dato, numerico o no) nel seguente modo:

Dim x as Variant

For Each x in Casuali

Media = Media + Casuali(Val(x))

Next x

Il significato è: ripeti per ogni elemento del vettore Casuali (For Each), estrai il valore dell'elemento (x) e utilizzalo per il calcolo della media. Questo tipo di cicli è più lento rispetto a quelli che usano direttamente l'indice di un vettore. E' tuttavia usato talvolta dai programmatori perchè semplifica la gestione degli indici dei vettori (soprattutto con i vettori dinamici).

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it