lamarozzo ha scritto:Sei vuoi passare un array bidimensionale ad una funzione basta fare
Codice: Seleziona tutto
//dichiarazione
void funzione (int *matrice[2]);
int main()
{
int a[3][2];
funzione(a);
}
Ricordati che nella lista di parametri devi sempre dichiarare la grandezza (in questo caso 2) dell'ultima dimensione dell'array.
Gli array multidimensionali sono la soluzione più comoda se ne conosci le dimensioni al tempo di compilazione. Altrimenti devi ricorrere all'allocazione dinamica. Se con la matrice in questione devi fare operazioni intensive (calcoli) devi fare in modo che occupi uno spazio contiguo in memoria.
Ad esempio seguendo il codice di Gallows. Soltanto che io eviterei di implementare le funzioni set e get per accedere alla matrice per non appesantire troppo il programma.
Gallows suggeriva di usare i void* per scrivere codice generico. Il problema di quella soluzione, a mio avviso, è la type safety. C'è un'altra soluzione: usare le macro del preprocessore. I fortunati utilizzatori del c++ hanno invece i potentissimi template.
A presto.
P.S. Corrado ha ragione
Lamarozzo ... attenzione alla sintassi ...
Sul passaggio di vettori bidimensionali come argomenti di funzioni hai ragione; un vettore bidimensionale in C è un "vettore di vettori".
Il nome di un vettore bidimensionale è quindi l'indirizzo del suo primo elemento, che è a sua volta un vettore; proprio per questo motivo il C deve conoscere la seconda dimensione del vettore (in sostanza, il C deve per forza conoscere la dimensione di ogni elemento del vettore).
Se io scrivo:
Codice: Seleziona tutto
int myvect[3][4] = {{1, 2, 3, 4}, {3, 2, 0, 1}, {5, 8, 1, 1}};
sto definendo un vettore di 3 elementi dove ogni elemento è un blocco da (4*sizeof(int)) byte.
E' sbagliata invece la sintassi::
(puntatore ad un puntatore ad int)
ed anche:
(vettore di ??? puntatori a int)
ed anche:
Infatti:
significa: "
vettore di 4 puntatori a int
La sintassi corretta è:
che significa: "
puntatore ad un vettore di int
Quindi il prototipo corretto per max_matrice è:
P.S. A parte questo, il codice scritto da DaD per calcolare il valore massimo mi sembra sbagliato; la versione giusta dovrebbe essere:
Codice: Seleziona tutto
/* matrix.h */
int max_matrice(int (*a)[3], int n, int m){
int i, j, max = a[0][0];
for(i = 0; i < n; i++){
for(j = 0; j < m; j++){
if(a[i][j] > max)
max = a[i][j];
}
}
return max;
}