Il mio compilatore si lamenta quando passo un vettore bi-dimensionale a una funzione che richiede un puntatore a un puntatore.
La regola (vedere domanda 6.3) per cui i vettori decadono in puntatori non si applica ricorsivamente. Un vettore di vettori (cioe` un vettore bi-dimensionale in C) decade in un puntatore a un vettore, non un puntatore a puntatori. I puntatori a vettori possono essere confusi, e devono essere trattati attentamente; vedere anch domanda 6.13. (La confusione e` aumentata dall'esistenza di compilatori incorretti, incluso qualche vecchia versioni di pcc and lint derivato da pcc, che impropriamente accettano assegnamenti di vettori multi dimensionali.)
Se si passa un vettore bi-dimensionale a una funzione:
int array[NROWS][NCOLUMNS]; f(array);la dichiarazione di funzione deve essere conforme:
f(int a[][NCOLUMNS]) { ... }or
f(int (*ap)[NCOLUMNS]) /* ap is a pointer to an array */ { ... }Nella prima dichiarazione, il compilatore opera l'usuale implicita riscrittura del parametro di ``vettore di vettori'' a ``puntatore a vettore'' (vedere domande 6.3 e 6.4); nella seconda forma la dichiarazione del puntatore e` esplicita. Dal moamento che la funzione chiamata non alloca spazio per il vettore, non c'e` bisogno di sapere la dimensione totale, dunque il numero di righe, NROWS, puo` essere omesso. La ``forma'' del vettore e` ancora importante, dunque la dimensione delle colonne NCOLUMNS (e, per vettori tri o multi dimensionali, quelle nel mezzo) deve essere mantenuta.
Se una funzione e` gia` dichiarata accettare un puntatore a un puntatore, e` probabilmente senza senso passargli un vettore bi-dimensionale direttamente.
Vedere anche domande 6.12 and 6.15.
Riferimenti:
K&R1 Sez. 5.10 p. 110
K&R2 Sez. 5.9 p. 113
H&S Sez. 5.4.3 p. 126
Leggere di seguito: prev prossima su cima
Questa pagina e` di Steve Summit // Copyright 1995 // mail feedback