Conozco los algoritmos para asignar/desasignar una matriz bidimensional de forma dinámica, sin embargo, no estoy muy seguro de lo mismo para las matrices 3D.
Usando este conocimiento y un poco de simetría, se me ocurrió el siguiente código.
(tuve dificultades para visualizar en 3D durante la codificación).asignación/desasignación dinámica de matrices en 2D y 3D
Comente sobre la corrección y sugiera una mejor alternativa (eficiente o intuitiva), en su caso.
Además, creo que a estas matrices 2D y 3D se puede acceder normalmente como matrices estáticas como arr2D [2] [3] y
arr3D [2] [3] [2]. ¿Derecha?
Código de 2D
//allocate a 2D array
int** allocate2D(int rows,int cols)
{
int **arr2D;
int i;
arr2D = (int**)malloc(rows*sizeof(int*));
for(i=0;i<rows;i++)
{
arr2D[i] = (int*)malloc(cols*sizeof(int));
}
}
//deallocate a 2D array
void deallocate2D(int** arr2D,int rows)
{
int i;
for(i=0;i<rows;i++)
{
free(arr2D[i]);
}
free(arr2D);
}
Código de 3D
//allocate a 3D array
int*** allocate3D(int l,int m,int n)
{
int ***arr3D;
int i,j,k;
arr3D = (int***)malloc(l * sizeof(int **));
for(i=0;i<l;i++)
{
arr3D[i] = (int**)malloc(m * sizeof(int*));
for(j=0;j<m;j++)
{
arr3D[i][j] = (int*)malloc(n*sizeof(int));
}
}
return arr3D;
}
//deallocate a 3D array
void deallocate3D(int arr3D,int l,int m)
{
int i,j;
for(i=0;i<l;i++)
{
for(int j=0;j<m;j++)
{
free(arr3D[i][j]);
}
free(arr3D[i]);
}
free(arr3D);
}
también puede asignar una matriz n dimensional en un solo bloque lo suficientemente grande como para contener punteros y datos. De esa manera puede ir int ***** array = allocate (sizeof (int), 10, 10, 10, 10, 10, 0); para asignar una matriz int 5D e indexarla mediante la matriz [a] [b] [c] [d] [e] sin la necesidad de calcular los índices. Utilicé esto cuando tuve que reemplazar grandes matrices de pila con montones para programar para trabajar en teléfonos con un tamaño de pila limitado sin necesidad de hacer ajustes serios al código que indexa las matrices. Vea aquí: https://sourceforge.net/p/gnugos60/code/HEAD/tree/trunk/GNUGoS60/common/src/ndMalloc.cpp – idij