我目前被一个使用多维数组的遗留代码所困扰:
#define B 25
int Table[A][B][C][D][E][F];
我需要用一个动态值来改变B常数。问题是,我需要保持这个表和以前一样,这样除了重写的分配之外,我就没有其他东西了。
我想听听你对如何做这样一件事的想法/意见。
目前,我正在尝试对表的末尾进行typedef([C][D][E](,以便在分配时对其进行malloc,但我遇到了一些错误,比如表没有像遗留代码所希望的那样。。。
//int32_t Table[A][B][C][D][E][F];
int32_t* Table[A];
typedef int32_t type_1_t[E][F];
typedef type_1_t type_2_t[C][D];
for (int i = 0; i < A; i++)
Table[i] = (int32_t*) malloc (sizeof (type_2_t) * dynamic_B);
使用它,我在使用该表时会得到一个错误("错误:下标值既不是数组,也不是指针或向量"(。
XXX = Table [a][b][c][d][e][f];
您的类型错误:
int32_t* Table[A];
实际上应该是
int32_t (*Table[A])[C][D][E][F];
或者,当你输入时
type_2_t *Table[A];
这应该奏效。
眼睛受伤了
为什么不将其声明为int***表,并在5个嵌套for循环中对其进行malloc?这样,如果任何其他维度决定动态化,你就可以经得起未来考验:(
Table = malloc(A * sizeof(int *****));
for (i=0; i<A; ++i)
{
Table[i] = malloc(B * sizeof(int ****));
for (i1=0; i1<B; ++i1)
{
...
}
}
免责声明:我很可能弄错了间接引语的数量。
#define SIZE_B (C*D*E*F*sizeof(int32_t))
int32_t***** Table[A];
or (int i = 0; i < A; i++)
Table[i] = (int32_t*****) malloc ( SIZE_B * dynamic_B);
编辑2:上面的代码完全没有任何作用,完全是垃圾。留下它作为一个提醒,在我发布之前彻底检查代码
编辑3:这就像一个魅力在这里,最后:(
#define SIZE_B (C*D*E*F*sizeof(int))
typedef int t2[C][D][E][F];
t2* ar[A];
int dynB = 3;
for(int i=0;i<A;i++)
{
ar[i] = (t2*)malloc(SIZE_B * dynB);
}