Question 6.18

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