使用以下(简化)数据定义:
#define DIM0 10
#define DIM1 15
typedef struct {
uint32_t var1:
...
int8_t arrayVar1[DIM0];
} dataClass0;
typedef struct {
uint32_t var1:
...
int8_t arrayVar1[DIM1];
} dataClass1;
在一个给定点我必须创建这些结构的数组并处理它们。
除阵列(不同长度)外,处理完全相同。现在它是这样的:
dataClass0 *data;
data = (dataClass0 *) malloc(dimension * sizeof (dataClass0));
// Processing and filling structure
data[i].var1 = <value>
...
现在我为每个数据类重复了相同的功能。在使用这些数据结构时,有没有办法复制代码?
注意:
int8_t *arrayVar1
。答案 0 :(得分:3)
typedef struct {
uint32_t var1:
...
int8_t arrayVar[]; /* Declare as flexible array, allowed since C99 */
} dataClass;
用这样的东西分配:
data1 = malloc(sizeof (dataCLass) + DIM1*sizeof ((dataClass*)NULL)->arrayVar[0]);
data2 = malloc(sizeof (dataCLass) + DIM2*sizeof ((dataClass*)NULL)->arrayVar[0]);
or define
#define ALLOCDATA(dim) malloc(sizeof (dataCLass) + (dim)*sizeof ((dataClass*)NULL)->arrayVar[0]);
定义
#define ELEMENT1(data, i) (dataClass*)(((char*)(data))+(i)*(DIM1+sizeof (dataCLass)))
#define ELEMENT2(data, i) (dataClass*)(((char*)(data))+(i)*(DIM2+sizeof (dataCLass)))
或者如果您参数化DIM
#define ELEMENT(data, i, dim) (dataClass*)(((char*)(data))+(i)*((dim)+sizeof (dataCLass)))
享受
ELEMENT1(data1, i)->var1 = 1;
ELEMENT1(data1, i)->arrayVar1[9] = 4;
ELEMENT2(data2, i)->arrayVar1[14] = 4;
或
ELEMENT(data1, i, DIM1)->var1 = 1;
ELEMENT(data1, i, DIM1)->arrayVar1[9] = 4;
ELEMENT(data2, i, DIM2)->arrayVar1[14] = 4;
不完美,但不是太奇怪的构造不能使用。
编辑: ELEMENT定义应更改为
#define ELEMENT1(data, i) (dataClass*)(((char*)(data))+(i)*(DIM1*sizeof ((dataClass*)NULL)->arrayVar[0]+sizeof (dataCLass)))
#define ELEMENT2(data, i) (dataClass*)(((char*)(data))+(i)*(DIM2*sizeof ((dataClass*)NULL)->arrayVar[0]+sizeof (dataCLass)))
#define ELEMENT(data, i, dim) (dataClass*)(((char*)(data))+(i)*((dim)*sizeof ((dataClass*)NULL)->arrayVar[0]+sizeof (dataCLass)))
通过此更改,您的arrayVar字段可以是任何类型,并且不限于大小为1的元素。
答案 1 :(得分:1)
难道你不能让阵列动态吗?那么你用malloc()
创建你的结构然后初始化一些成员以保持大小(并确保它以uint8_t *
而不是实际数组结束,或使用VLA)?
答案 2 :(得分:0)
这取决于您是否要在最初使用不同的值填充数组。否则你可以只有一个初始化两种结构类型的宏
#define STRUCTURE_INITIALIZER(VAR1, VAR2) { .var1 = (VAR1), .var2 = (VAR2) }
并将其用作
dataClass0 data = STRUCTURE_INITIALIZER(31, 42);
您的数组组件将始终0
初始化,无论其大小如何。
初始化你的东西的malloc
ed数组:
dataClass0 *data = malloc(dimension * sizeof (dataClass0));
// Processing and filling structure
for (size_t i = 0; i < dimension; ++i)
data[i]= (dataClass0)STRUCTURE_INITIALIZER(43, i);
BTW,更喜欢正确初始化变量而不是强制转换malloc
。