gpt4 book ai didi

c:当 1 维未知时 3d 数组的动态分配

转载 作者:行者123 更新时间:2023-12-04 12:11:59 25 4
gpt4 key购买 nike

我正在尝试使用这些参数动态分配一个 3d 数组:1)我知道的前两个维度,可以定义为常量(ACOUNT 和 BCOUNT)。第三个需要在运行时决定。2) 我希望能够使用以下方法寻址数组:arr[i][j][k] = n;3) 我想避免被超过一百万个 mallocs 杀死

所以在下面的代码中,使用“*arr”的第一部分工作得很好,而使用“*brr”的第二部分却以遗憾的结果告终。有什么方法可以使用星号魔法药水来实现这些参数吗?

(我正在使用 VS2010 C++ 进行编译,因此进行了令人讨厌的转换。)

#define ACOUNT 9000
#define BCOUNT 195
#define CCOUNT 8

short (*arr)[BCOUNT][CCOUNT];
short (*brr)[ACOUNT][BCOUNT];

void main(void)
{

arr = (short (*)[BCOUNT][CCOUNT] ) malloc( (unsigned long) ACOUNT * BCOUNT *CCOUNT * sizeof(short));

for (int j = 0; j < ACOUNT; ++j)
for (int k = 0; k < BCOUNT; ++k)
for (int m = 0; m < CCOUNT; ++m)
arr[j][k][m] = j + k + m;

// still alive here

brr = (short (*)[ACOUNT][BCOUNT] ) malloc( (unsigned long) ACOUNT * BCOUNT *CCOUNT * sizeof(short));

for (int j = 0; j < ACOUNT; ++j)
for (int k = 0; k < BCOUNT; ++k)
for (int m = 0; m < CCOUNT; ++m)
brr[j][k][m] = j + k + m;

// error: unhandled exception ...access violation... etc
}

最佳答案

抱歉,在我发布这篇文章后我意识到您厌恶过多的 malloc(或 calloc)语句。该代码使用过多的此语句,这将需要过多的清理(自由语句)。如果您可以使用其中的一部分,我将离开该帖子。瑞克

下面是一些代码,用于说明为矩阵动态创建和分配空间。它们还显示了连续更大维度矩阵的模式。请注意,参数列表仅包括每个索引的所需大小(顺序);即行(r),然后是 c,r(列,行),然后是 p,c,r(页,列,行)等等。请注意,这些函数也将 malloc 替换为 calloc,这只是一种偏好。问候,瑞克

double * Create1D(int r)
{
double *space;
double *arr;

space = calloc(r*sizeof(double), sizeof(double));
arr = calloc(sizeof(double), sizeof(double));
arr = (double *)space;

return arr;
}

double ** Create2D(int c, int r)
{
double *space;
double **arr;
int y;

space = calloc(c*r*sizeof(double), sizeof(double));
arr = calloc(c * sizeof(double *), sizeof(double));
for(y=0;y<c;y++)
{
arr[y] = (double *)space + (y*r);
}
return arr;
}

double *** Create3D(int p, int c, int r)
{
double *space;
double ***arr;
int x,y;

space = calloc (p*c*r*sizeof(double),sizeof(double));
arr = calloc(p * sizeof(double **), sizeof(double));
for(x = 0; x < p; x++)
{
arr[x] = calloc(c * sizeof(double *),sizeof(double));
for(y = 0; y < c; y++)
{
arr[x][y] = ((double *)space + (x*(c*r) + y*r));
}
}
return arr;
}

double **** Create4D(int hR, int p, int c, int r)
{
double *space;
double ****arr;
int w,x,y;

space = calloc(hR*p*c*r*sizeof(double), sizeof(double));
arr = calloc(hR * sizeof(double ***), sizeof(double));
for(w=0;w<hR;w++)
{
arr[w] = calloc(p * sizeof(double **), sizeof(double));
for(x=0;x<p;x++)
{
arr[w][x] = calloc(c * sizeof(double *), sizeof(double));
for(y=0;y<c;y++)
{
arr[w][x][y] = ((double *)space + (w*(p*c*r) + x*(c*r) + y*r));
}
}
}
return arr;
}

double ***** Create5D(int hC, int hR, int p, int c, int r)
{
double *space;
double *****arr;
int v,w,x,y;

space = calloc(hC*hR*p*c*r*sizeof(double),sizeof(double));
arr = calloc(hC * sizeof(double ****),sizeof(double));
for(v=0;v<hC;v++)
{
arr[v] = calloc(hR * sizeof(double ***),sizeof(double));
for(w=0;w<hR;w++)
{
arr[v][w] = calloc(p * sizeof(double **),sizeof(double));
for(x=0;x<p;x++)
{
arr[v][w][x] = calloc(c * sizeof(double *),sizeof(double));
for(y=0;y<c;y++)
{
arr[v][w][x][y] = ((double *)space + (v*(hR*p*c*r) + w*(p*c*r) + x*(c*r) + y*r));
}
}
}
}
return arr;
}

double ****** Create6D(int hP, int hC, int hR, int p, int c, int r)
{
double *space;
double ******arr;
int u,v,w,x,y;

space = calloc(hP*hC*hR*p*c*r*sizeof(double),sizeof(double));
arr = calloc(hP * sizeof(double *****),sizeof(double));
for(u=0;u<hP;u++)
{
arr[u] = calloc(hC * sizeof(double ****),sizeof(double));
for(v=0;v<hC;v++)
{
arr[u][v] = calloc(hR * sizeof(double ***),sizeof(double));
for(w=0;w<hR;w++)
{
arr[u][v][w] = calloc(p * sizeof(double **),sizeof(double));
for(x=0;x<p;x++)
{
arr[u][v][w][x] = calloc(c * sizeof(double *),sizeof(double));
for(y=0;y<c;y++)
{
arr[u][v][w][x][y] = ((double *)space + (u*(hC*hR*p*c*r) + v*(hR*p*c*r) + w*(p*c*r) + x*(c*r) + y*r));
}
}
}
}
}
return arr;
}

关于c:当 1 维未知时 3d 数组的动态分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8976730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com