PDA

Visualizza la versione completa : [C] funzioni che modificano array


gnl
19-04-2004, 13:26
Salve!

Io adopero il C per fare i miei calcoli. Una cosa che non ho ben capito, e' come scrivere una funzione che modifica un array a uno o piu' inidici, come per esempio una funzione che riempie una matrice di numeri casuali.

Ho capito che per esempio

void matrixFill( double A[DIM][DIM] );

funzionerebbe, ma che il modo giusto implica l'uso dei puntatori. Qualcuno puo' dirmi come:

- definire la funzione;
- definire l'array da modificare (ovunque sia da definire)
- chiamare la funzione

Grazie!!!

Giuseppe

kentaromiura
19-04-2004, 13:33
Originariamente inviato da gnl
Salve!

Io adopero il C per fare i miei calcoli. Una cosa che non ho ben capito, e' come scrivere una funzione che modifica un array a uno o piu' inidici, come per esempio una funzione che riempie una matrice di numeri casuali.

Ho capito che per esempio

void matrixFill( double A[DIM][DIM] );

funzionerebbe, ma che il modo giusto implica l'uso dei puntatori. Qualcuno puo' dirmi come:

- definire la funzione;
- definire l'array da modificare (ovunque sia da definire)
- chiamare la funzione

Grazie!!!

Giuseppe
non e' piu' giusto, e' uguale ..
poiche' double matrixFill(double A[DIM][DIM] )
viene tradotto internalmente in
double matrixFill(double **A)
in piu' essendo di dimensione fissa viene sicuramente allocato
uno spazio corretto per ospitare il vettore invece definendolo
double matrixFill(double **A)
la cosa puo' creare problemi di buffer overflow e/o
sovrascrittura ad indirizzi errati..
RICORDATI sempre di lavorare con array dichiarati di dimensione fissa
a meno che tu non sappia cosa vai a fare..

gnl
19-04-2004, 13:37
Grazie! io lavoro sempre con array a dimensione fissa, anche se questa storia dell'allocazione dinamica mi tenta...

Giuseppe

kentaromiura
19-04-2004, 13:43
Originariamente inviato da gnl
Grazie! io lavoro sempre con array a dimensione fissa, anche se questa storia dell'allocazione dinamica mi tenta...

Giuseppe
per l' allocazione dinamica vediti i costrutti malloc e free
(spero di non confondermi col c++ dove invece esiste il new..)

zaknafein
19-04-2004, 22:22
Puoi provare cosi:

void matrixFill(double *A[DIM][DIM]) {
int i,j;
for(i=0;i<DIM;i++)
for(j=0;j<DIM;j++)
*A[i][j]=0.0; /* o qualsiasi valore che vuoi usare come default */
}

Per chiamarla poi non fai altro che usare:
matrixFill(&A[DIM][DIM]);

Devi usare i puntatori in quanto č l'unico modo che hai per passare e sopratutto modificare una matrice.
Se vuoi allocarla dinamicamente devi tenere presente che solo il primo parametro dimensionale puņ essere variabile, tutti gli altri devono essere noti a tempo di compilazione.

Loading