double ***mat;
mat=(double***)malloc(ndimension*(sizeof(double));
ma purtroppo ottengo un errore a run time.
Non riesco a capire come devo fare.
Grazie in anticipo a chi può aiutarmi
gianluca
non e' sufficiente: devi allocare un array di puntatori, poi
per ognuno di questi allocare un array di puntatori e per ognuno di
questi devi allocare un array di double.
// non testato
// alloca l'equivalente di mat[NX][NY][NZ]
mat = malloc( NX * sizeof( double ** ) );
for( i = 0; i < NX; i ++ ){
mat[i] = malloc( NY * sizeof (double * ) );
for( j = 0; j < NY; j++ ){
mat[i][j] = malloc( NZ * sizeof double );
}
}
Una minuzia: in C non occorre il cast prima di malloc. Meno cast inutili
metti nel tuo codice e meno rischi di inserire errori subdoli! :)
> ma purtroppo ottengo un errore a run time.
Ricordati sempre di riportare che errore ottieni di preciso! Cosi' ci
diventa piu' facile aiutarti! :)
> Non riesco a capire come devo fare.
> Grazie in anticipo a chi puņ aiutarmi
ciao
Giacomo
>Ciao a tutti,
>ho bisogno di allocare dinamicamente una matrice tridimensionale. Ho
>provato in questo modo:
>
>double ***mat;
>
>mat=(double***)malloc(ndimension*(sizeof(double));
Il cast sul valore di ritorno di malloc() non si usa in C (mentre è
obbligatorio in C++). Se vuoi allocare una matrice MxNxP scriverai:
double ***mat = malloc(M * sizeof(double**));
...
size_t i, j;
for (i=0; i<M; i++) {
mat[i] = malloc(N * sizeof(double*));
for (j=0; j<P; j++) {
mat[i][j] = malloc(P * sizeof(double));
...
}
}
> for (j=0; j<P; j++) {
Errata Corrige: j<N
> mat[i][j] = malloc( NZ * sizeof double );
sizeof(double)
Ci vogliono le parentesi per i tipi.
Uh, si'. Grazie. In effetti il mio codice era "non testato"
ciao
Giacomo
grazie a tutti,
ho risolto grazie ai vostri suggerimenti
Pleg
L'unica differenza è che nel secondo caso ti complichi la vita :-)
"Non stai pensando quadrimensionalmente" (cit)
:-)
Pleg
Dal punto di vista delle prestazioni probabilmente sarebbe meglio
allocare un unico blocco:
VANTAGGI:
- hai meno operazioni di allocazione;
- utilizzi meno memoria;
- i dati si trovano in memoria contigua => migliore utilizzo della cache
SVANTAGGI:
- l'accesso casuale agli elementi potrebbe essere più lento. Questo
potrebbe succedere se i valori M e N non sono noti in runtime oppure non
sono potenze di due. Ma questo non si applica alle iterazioni che se
fatte per bene ti costano meno che con l'altro metodo.
E.