2011-09-19 102 views
1

我使用多个维度阵列目前卡住与传统代码:C:静态到动态分配在多个维数组

#define B 25 
int Table[A][B][C][D][E][F]; 

我需要由动态值来改变B常数。问题是,我需要按照过去的方式保留表格,这样我就不会再有其他任何东西,只能重写配置了。

我想就如何做这样的事情有你的想法/意见。

当前我试图在分配时键入表尾([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]; 
+1

遗产代码想要什么?什么是错误? – jpalecek

+0

使用每个维度的表格。目前我得到的错误是“下标值既不是数组也不是指针也不是矢量”,这可能来自我的typedefs或malloc,这就是为什么我没有发布我正在尝试的代码。 – claf

+0

如果遗留代码将此表视为多维数组,我不会看到它如何处理您的解决方案与非连续的内存区域,因为它会尝试通过简单的解引用访问您的表。 –

回答

2

你找错人类型:

int32_t* Table[A]; 

应该事实上

int32_t (*Table[A])[C][D][E][F]; 

,或者你typedef定义它

type_2_t *Table[A]; 

这应该是关键。

+0

这似乎并不能解决问题,但在使用表格[a] [b] [c] [d] [e] [f]时仍然会出现相同的错误。 – claf

+0

Works here:http://ideone.com/vUHQj – jpalecek

+0

typedef'd版本不起作用,第一个编译但segfault(在我的代码中)。 – claf

-1
#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); 
    } 
+0

我无法使用这个多维度访问表格!我想要遗留代码(使用Table [a] [b] [c] [d] [e] [f])来工作... – claf

+0

编辑我的代码,试试 – Djole

+0

这是无稽之谈。你将一个指向数组的指针指向指向指针的指针,这实际上不会做正确的事情。 – jpalecek

0

眼睛受伤!
为什么不把它声明为int * * * * * * Table和malloc它在5个嵌套循环中?这样,你将来如果发面任何其他尺寸决定去动态:)

Table = malloc(A * sizeof(int *****)); 
for (i=0; i<A; ++i) 
{ 
    Table[i] = malloc(B * sizeof(int ****)); 
    for (i1=0; i1<B; ++i1) 
    { 
    ... 
    } 
} 

声明:我最有可能得到间接寻址错误的数量。

+0

我不想使用这个解决方案,因为我很懒(写循环),并且存在明显的性能问题。 – claf

+0

然后你在内部循环中分配这个数组吗?如果一次完成,性能差异不应太烦人。国际海事组织,如果你今天懒惰它会咬你2个月:) – Torp

+0

我在谈论性能问题后访问表中的程序。 – claf