Lavorare con le Matrici: dichiarazioni, limiti, distruzione
Ultima modifica: 27-05-2016

Abbiamo appena visto le varie tipologie delle matrici:

matrice statica e dinamica

mono e pluri dimensionali

i limiti inferiori e superiori di ogni dimensione

 

Vediamo ora come iniziare a lavorare con le matrici.

 

Dichiarazioni di matrici

Ci sono molti modi per dichiarare una matrice. Vediamone alcuni.

Per matrici ad una dimensione queste sono possibili dichiarazioni:

Dim Matrice(20) As Double
Dim MiaMatrice(1 To 15)
Dim TuaMatrice(100 To 120)

La seguente dichiarazione è rifiutata perchè i limiti possono essere indicati solo da costanti numeriche è non è consentito l'uso di variabili:

A=50
Dim Matrice(A)

 

Per dichiarare matrici a più dimensioni possiamo usare le seguenti forme:

Dim DueDimensioni(10, 5)
Dim TreDimensioni(10, 5, 3)
Dim Due_Dimensioni(1 To 10, 1 To 5)
Dim Tre_Dimensioni(1 To 10, 1 To 5, 1 To 3)
Dim Due_Dimensioni(4 To 10, 2 To 5)
Dim Tre_Dimensioni(1 To 10, 5, 1 To 3)

 

Le Matrici statiche così dichiarate rimangono tali per tutta la durata della routine in cui vengono usate e, una volta dichiarate, non possono essere più ridimensionate.

Per le Matrici dinamiche il comportamento è diverso. L'uso di queste ultime è più elastico perchè, come il loro nome suggerisce, sono dinamiche.  Possono essere ridimensionate più volte a seconda delle necessità che si incontrano durante il loro uso.

Una matrice dinamica può essere dichiarata in due tempi.

La prima dichiarazione può essere fatta nella zona usata per la dichiarazione per le variabili lasciando vuote le due parentesi tonde:

Dim Matrice()

La seconda dichiarazione deve fatta prima del suo utilizzo usando la istruzione ReDim

ReDim Matrice(1 To 50, 1 To 5)

Per indicare i limiti delle dimensioni possono essere usate anche delle variabili come in questo esempio:

A=50
ReDim Matrice(1 to A)

La dichiarazione di una matrice dinamica può essere espressa in tutti i modi visti più sopra ma anzichè l'istruzione Dim usa l'istruzione ReDim e per i limiti delle varie dimensioni, lo ripeto, sono accettate anche delle variabili numeriche.

Non solo. L'uso della istruzione ReDim può essere usata tutte le volte che si vuole nei seguenti modi:

Uso della sola istruzione ReDim Matrice(1 to A)

Uso della istruzione ReDim con la Parola chiave Preserve usando questa sintassi: Redim Preserve Matrice(15)

Senza l'uso della parola chiave Preserve ogni volta si usa l'istruzione ReDim vengono persi i dati precedentemente memorizzati nella matrice, mentre usando la parola chiave Preserve, la matrice viene ridimensionata ma conserva i dati precedentemente memorizzati.

 

 

Computo degli elementi disponibili in una matrice

In tutte queste dichiarazioni, il limite inferiore di ognuna delle dimensioni della matrice, se omesso, è da intendersi, a seconda delle direttive dell'istruzione Option Base.

Tutte le matrici senza indicazione del limite inferiore sono da intendersi a base 0 (zero), mentre se è indicata con Option Base 1 sono da intendersi a base 1 (uno).

 

Attenzione: Quando si aggiungono dimensioni a una matrice, lo spazio di memorizzazione totale necessario aumenta in modo considerevole. È pertanto consigliabile utilizzare le matrici a più dimensioni con cautela, soprattutto nel caso di matrici Variant, che hanno dimensioni maggiori rispetto agli altri tipi di dati.

 

Gli elementi che sono disponibili in una Matrice si calcolano in questo modo:

per una matrice ad una dimensione: (Limite Sup - Limite inf) + 1

per una matrice a due dimensioni: ((Limite Sup - Limite inf) + 1) * ((Limite Sup - Limite inf) + 1)

per una matrice a più di due dimensioni: ((Limite Sup - Limite inf) + 1) * ((Limite Sup - Limite inf) + 1) * ((Limite Sup - Limite inf) + 1)  ecc

Qualche esempio? Eccolo.

Dim Matrice(20) => Option Base 0 = (20 - 0) + 1 = 21
Dim Matrice(20) => Option Base 1 = (20 - 1) + 1 = 20
Dim MiaMatrice(1 To 15) =(15 - 1) + 1 = 15
Dim MiaMatrice(3 To 18) =(18 - 3) + 1 =16
Dim Tre_Dimensioni(1 To 10, 1 To 5, 1 To 3) =((10-1)+1)*((5-1)+1)*((3-1)+1) =150
ReDim Due_Dimensioni(4 To 10, 2 To 5) =((10-4)+1)*((5-2)+1) = 28

 

 

Lettura dei limiti inferiori e superiori di una matrice e sua distruzione

Questo si applica sia a matrici statiche che a matrici dinamiche.

E' possibile leggere i limiti inferiori e superiori e, per liberare la memoria che le matrici occupano in memoria, è possibile distruggere le matrici.

In questa fase le operazioni sono molto semplici anche se ci sono delle piccole differenze tra le matrici statiche e quelle dinamiche.

 

Lettura dei limiti della matrice

Per leggere i limiti di una matrice sono disponibili due Funzioni:

LBound per leggere il limite inferiore

UBound per leggere il limite superiore

La sintassi è semplice:

Per Dim Matrice(20)

LInf = LBound(Matrice) restituisce 0 o 1 dipendentemente dall'impostazione di Option Base
LSup = UBound(Matrice) restituisce 20

Se la matrice è a più dimensioni, occorre specificare la dimensione che si intende leggere.

Per una matrice dichiarata con Dim DueDimensioni(10, 5)

LInf1 = LBound(DueDimensioni, 1) restituisce 0 o 1 dipendentemente dall'impostazione di Option Base
LSup1 = UBound(DueDimensioni, 1) restituisce 10
LInf2 = LBound(DueDimensioni, 2) restituisce 0 o 1 dipendentemente dall'impostazione di Option Base
LSup2 = UBound(DueDimensioni, 2) restituisce 5

Per una matrice dichiarata con Dim Due_Dimensioni(1 To 10, 1 To 5)

LInf1 = LBound(Due_Dimensioni, 1) restituisce 1
LSup1 = UBound(Due_Dimensioni, 1) restituisce 10
LInf2 = LBound(Due_Dimensioni, 2) restituisce 1
LSup2 = UBound(Due_Dimensioni, 2) restituisce 5

 

 

Distruzione di una matrice

Dopo averle usate, se le matrici non servono più, è possibile eliminarle per risparmiare spazio usato in memoria.

Viene usata l'istruzione Erase per reinizializzare gli elementi di matrici di dimensioni fisse e riallocare lo spazio di archiviazione della matrici dinamiche.

reinizializzare gli elementi di matrici di dimensioni fisse (statiche): la matrice viene svuotata dei suoi contenuti ma tutte le locazioni, sebbene vuote. rimangono occupando ancora la memoria necessaria a mantenerle attive.

riallocare lo spazio di archiviazione della matrici dinamiche: la matrice viene svuotata di tutti i suoi contenuti ma anche di tutte le le locazioni liberando di fatto spazio in memoria continuando ad occupare poco più di quanto occuperebbe una semplice variabile.

Che cosa significhino queste due dichiarazioni, forniteci dalla guida in linea, è presto detto.

Le matrici statiche vengono semplicemente svuotate dei dati che finora erano memorizzate nelle sue varie locazioni, ma conservano tutte le locazioni anche se vuote, mentre le matrici dinamiche vengono proprio distrutte e lasciate allo stato di quando sono state create con Dim Matrice() liberando di fatto tutta la memoria finora occupata.

La verifica di quanto detto possiamo eseguirla cercando di leggere i limiti dell'una e dell'altra matrice.

Se, dopo la loro distruzione tramite l'istruzione Erase, eseguiamo:

LInf = LBound(Matrice)

LSup = UBound(Matrice)

se Matrice() è una matrice statica riusciamo ancora a leggerne i limiti, ma se Matrice() è una matrice dinamica, queste istruzioni non andranno a buon fine, ma ci restituiranno un errore: "Errore di run-time 9: Indice non incluso nell'intervallo".