next up previous
Next: Vettore di puntatori Up: Algoritmi su matrici Previous: Algoritmi su matrici

Memorizzazione di una matrice

Per poter lavorare con matrici bisogna come prima cosa tenerle in memoria. Ci sono diversi modi di farlo, ma vedremo che la scelta più conveniente è una sola.

Se le dimensioni della matrice sono note a priori, quando si scrive il programma, la matrice può essere dichiarata staticamente con una istruzione del tipo double a[100][100]. Se si sceglie questa soluzione, il compilatore riserva una zona di memoria contenente 100*100 double adiacenti. L'elemento (i+1,j+1) della matrice è a[i][j]. Si noti che quest'ultima espressione viene automaticamente tradotta dal compilatore in a[i*100+j], a sua volta tradotta in *(a+i*100+j).

L'inconveniente di questo metodo è dovuto al fatto che quasi sempre la dimensione è nota solo al tempo dell'esecuzione, ed il C standard non prevede che si possa allocare una matrice con dimensioni non costanti.

Per utilizzare dimensione non costante, la memoria per la matrice va allocata dinamicamente a tempo di esecuzione. L'equivalente della soluzione precedente diventa

    double *a;
    a = calloc(n*n, sizeof *a);
Però adesso per accedere agli elementi dobbiamo usare la notazione a[i*n+j], perché il compilatore non saprebbe come trattare la notazione più naturale a[i][j]. Questa soluzione è da evitare soprattuto perché alloca un unico blocco di memoria, e se le matrici che trattiamo sono molto grandi non è facile trovare un unico blocco libero.



 
next up previous
Next: Vettore di puntatori Up: Algoritmi su matrici Previous: Algoritmi su matrici
Daniele Finocchiaro
1998-11-13