我使用以下C函数来模拟4D阵列。除了添加额外的循环之外,还有一种很好的方法可以使这个函数足够通用以创建n维数组吗?
double ****alloc_4D_data(int wlen, int xlen, int ylen, int zlen)
{
int i,j,k;
double ****ary = (jdouble****)malloc(wlen*sizeof(jdouble***));
for (i = 0; i < wlen; i++)
{
ary[i] = (jdouble***)malloc(xlen*sizeof(jdouble**));
for (j = 0; j < xlen; j++)
{
ary[i][j] = (jdouble**)malloc(ylen*sizeof(jdouble*));
for (k = 0; k < ylen; k++)
{
ary[i][j][k] = (jdouble*)malloc(zlen*sizeof(jdouble));
}
}
}
return ary;
}
答案 0 :(得分:2)
在C语言中,多维数组的每个元素都存储在连续的存储区中。所以你只需要计算所有N维和malloc整个内存的元素总数。如:
/* int *Nlen is a N length array to store every dimensional array length
* int N is the Nlen array length indicates how many dimensions.
*/
double *alloc_ND_data(int wlen, int *Nlen, int N)
{
int i;
int total = 1;
double *array;
for(i = 0; i < N; i ++) {
/* Every dimension should mul the next depth dimension size */
total *= Nlen[i];
}
array = malloc(wlen*total*sizeof(jdouble));
return array;
}
答案 1 :(得分:0)
以这种方式构建的数组具有非常明显的递归结构。即第i级存储器只是指向第(i-1)级存储器的指针数组。只有0级内存包含实际对象而不是指针。因此,您可以通过这种方式轻松实现它,在单独的整数数组中传递大小。
这种情况下的递归将是尾递归,这意味着它可以很容易地用真正的循环实现替换(不需要中间LIFO存储)。但对我而言,它看起来像递归工作正常并且看起来更具可读性的情况之一。