对于有限域数学,我将相应的加法和乘法表存储为静态类型的整数数组,例如,对于GF(4/8),我有
static const uint8_t GF4ADD[4][4] = {...};
static const uint8_t GF8ADD[8][8] = {...};
现在,在运行时,程序从配置文件中读取所需的字段大小,并应将结构指针分配给相应的表:
struct obj data {
...
uint8_t** table_add;
uint8_t** table_mult;
...
};
switch(order) {
case 4:
data.table_add = GF4ADD;
data.table_mult = GF4MULT;
break;
case 8:
data.table_add = GF8ADD;
data.table_mult = GF8MULT;
break;
}
当然,上述方法不起作用,但应该让您了解我想要实现的目标。主要问题是我不知道我应该声明结构成员的类型,因为表的大小仅在运行时已知。此外,我不想仅使用表的一维索引。
谢谢,汤姆。
答案 0 :(得分:0)
你需要用指针声明它。之后,当您获得order
时,您将能够动态分配您需要的内存。
简单示例1(使用指针指针):
struct{
int ** table_add;
}data;
int main()
{
unsigned int order;
scanf("%u", &order);
// create "order" pointers
data.table_add = malloc(order * sizeof(int *));
// where each pointer points to "order" elements
for(unsigned int i = 0; i < order; i++)
data.table_add[i] = malloc(order * sizeof(int));
// fill with numbers
int counter = 0;
for(unsigned int i = 0; i < order; i++)
for(unsigned int j = 0; j < order; j++)
data.table_add[i][j] = counter++;
// read result
for(unsigned int i = 0; i < order; i++){
for(unsigned int j = 0; j < order; j++)
printf("%d ",data.table_add[i][j]);
printf("\n");
}
return 0;
}
简单示例2(分配2D数组):
将第一个例子的开头替换为:
...
unsigned int order;
scanf("%u", &order);
// allocate memory for a 2D array
data.table_add = malloc(sizeof(int[order][order]);
// fill with numbers
...
正如@Lundin所提到的,这种方式更有效率。我认为原因是3:
order * sizeof(int*)
)malloc
而不是order + 1
mallocs
- &gt;少frees
- &gt;减少错误)在您的情况下,您需要在循环中填充元素(循环遍历每个元素并分配它们,或循环遍历order
元素并使用memcpy
)