Newsgroup: it.comp.lang.c
Titolo: allocazione/deallocazione matrici 3d ?

Salve, ho necessità di allocare delle matrici 3D di unsigned char, ma stò
iniziando ad impazzire..
ho necessità di potervi accedere come  matrice[i][j][k].
per il 2D utilizzo :
unsigned char ** gimme_space(righe,colonne)
{
  unsigned char **matrix;
  matrix=malloc(unsigned char *)malloc(righe * sizeof(unsighed char *));
  for(int i=0; i<righe;i++)
    matrix[i]=(unsigned char *)malloc(colonne*sizeof(unsigned char *));
  return matrix;
}
void free_space(unsigned char ** matrix,int righe)
{
  for(int i=0; i<righe;i++)
    free(array[i]);
  free (array);
}
secondo voi come la posso "estendere" al 3D ?
thanx !!
jojo

 secondo voi come la posso "estendere" al 3D ?
se programmi in C il cast nel malloc non serve! Questo e' C++.
se programmi in C non puoi fare for(int i...... Questo e' C++.
inoltre suppongo che malloc(...)malloc(....); sia un errore di typing!
Ad ogni modo:
incominci con unsigned char ***gimme_space(x,y,z)
poi usi 2 for loops nidificati.
Se hai difficolta' scrivi pure.
Tommy

     matrix[i]=(unsigned char *)malloc(colonne*sizeof(unsigned char *));
occhio la size corretta e' (colonne*sizeof(unsigned char)) oppure 
(colonne*sizeof(*matrix[i])).
In questo caso ti e' andata bene poiche la size dell'oggetto era + piccola 
di quella di un puntatore quindi il tuo errore ti ha causatao solo una 
allocazione sovradimensionata.

 Se hai difficolta' scrivi pure.
ok, difficoltà : mi manda in crash l'applicazione :-)
l'errore me lo da già in allocazione, non quando libero.
io ho esteso come tua indicazione la routine precedente..
ecco il sorgente
//------------------ inizio -----------------
unsigned char *** gimme_space3D(int y, int x,int z);
void free_space3D(unsigned char*** first,int y,int z);
int main(int argc,char* argv[])
{
unsigned char ***prova3D;
prova3D=gimme_space3D(288,352,128);
free_space3D(prova3D,352,128);
return 0;
}
unsigned char ***gimme_space3D(int y,int x,int z)
{
 int i,j,k;
 unsigned char ***matrix = (unsigned char ***)malloc(z * sizeof(unsigned
char **));
 for(i = 0; i < y; i++)
 {
  matrix[i] = (unsigned char **)malloc(y * sizeof(unsigned char*));
   for (j=0;j<z;j++)
    matrix[i][j] = (unsigned char *)malloc(x * sizeof(unsigned char));
 }
 for(i=0;i<y;i++)
  for(j=0;j<x;j++)
   for(k=0;k<z;k++)
   matrix[i][j][k]=(unsigned char) 0;
 return matrix;
}
void free_space3D(unsigned char*** first,int y,int z)
{
 int i,j;
 for(i = 0; i < y; i++)
 {
  for(j = 0; j < z; j++)
   free(first[i][j]);
  free(first[i]);
 }
 free(first);
}
//-------- fine -------------
thanx !!!
jojo


è vero, hai ragione. era un errore di battitura :-)
thnx
jojo

    matrix[i][j][k]=(unsigned char) 0;
i varia da 0 a y e matrix e' stato allocato fino a z
j varia da 0 a x e matrix[i] e' stato allocato fino a y
k varia da 0 a z e matrix[i][j] e' stato allocato fino a x
le free e' inutile verificarle dato che devi riscrivere le allocazioni.
Ciao,
Drago.

 Ciao jojo hai pasticciato un po' con gli indici.
hai ragione !!
questo va bene?
a me sembra funzioni, vorrei però un vostro parere !
grazie & thnx !
/*** allocazione 3D ***/
unsigned char ***gimme_space3D(int y,int x,int z)
{
 int i,j,k;
 unsigned char ***matrix = (unsigned char ***)malloc(x * sizeof(unsigned
char **));
 for(i = 0; i < x; i++)
 {
  matrix[i] = (unsigned char **)malloc(y * sizeof(unsigned char*));
   for (j=0;j<y;j++)
    matrix[i][j] = (unsigned char *)malloc(z * sizeof(unsigned char));
 }
 for(i=0;i<x;i++)
  for(j=0;j<y;j++)
   for(k=0;k<z;k++)
   matrix[i][j][k]=(unsigned char) 0;
 return matrix;
}
void free_space3D(unsigned char*** first,int x,int y)
{
 int i,j;
 for(i = 0; i < x; i++)
 {
  for(j = 0; j < y; j++)


 grazie & thnx !
di niente.
Ciao,
Drago.

X dovere di cronaca va detto che le dimensioni dell'array sarebbe stato 
meglio salvarle insieme all'array, in maniera tale che il distruttore fosse 
stato in grado da solo di distruggere l'oggetto senza richiedere ulteriori 
parametri al chiamante.
Ciao,
Drago.

 ha scritto nel messaggio
news:b01i74$bs0$1...@news.ngi.it...

ottimo, hai ragione...
in modo da fare
free_space(vettore3D;
e basta..
grande..
thanx !