【发布时间】:2017-11-20 12:44:04
【问题描述】:
对于有限域数学,我将相应的加法和乘法表存储为静态类型的整数数组,例如,对于 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;
}
当然,上述方法不起作用,但它应该让您了解我想要完成的工作。主要问题是我不知道应该声明结构成员的类型,因为表的大小仅在运行时才知道。此外,我不想只使用表的一维索引。
谢谢,汤姆。
【问题讨论】:
-
听起来你需要研究一下动态分配。
-
如果您想拥有
uint8_t *[4] table_add;和uint8_t *[8] table_add;,将它们放在联合类型中是否可行? -
嗯,是的,当然。但是结构(以及它的成员)是在标头中声明的,并且仅在之后才实例化。所以问题是,我如何在标题中声明它,因为声明类型不知道大小。
-
C 语言在这里是有问题的,因为它不允许您在文件范围内声明可变长度数组 (VLA)。因此,如果您需要一个可以从多个文件访问的具有可变长度数组的结构,您将不得不做一些变通方法。最常见的方法是将数据“分解”成一个维度并计算运行时的索引。这是一个可以接受的解决方案,如果不是“漂亮”的话。 (高效的 C 代码很少是漂亮的。)