[英]Storing values directly into C struct with an array index
我可以使用以下命令读取通用C结构的所有变量值(假定所有相同的变量类型)
struct whichstruct{
float firstVar;
float ...
...
};
whichstruct whichStruct;
void printParams(structType *whichStruct) {
// Print out all values of a struct.
float *startVar = &(whichStruct->firstVar);
int numElements = sizeof(*whichStruct) / sizeof(startVar);
for (int i = 0; i < numElements; ++i)
printf("%d: %f\r\n", i, startVar[i]);
}
如果要存储说成员变量#10,如何等效存储值? 显然,由于它不是数组,因此以下操作不适用于whichStruct [i]行。 但是你明白了...
void setParams(structType *whichStruct, const int whichVar, const float val) {
// whichVar is the struct's member variable to access (2nd, 3rd, etc)
float *startVar = &(whichStruct->firstVar);
int numElements = sizeof(*whichStruct) / sizeof(startVar);
int index = sizeof(startVar) * whichVar; // How many bytes into the struct?
whichset[index] = val; // <-- trying to poke the value at the struct's correct byte address
printf("#%d = %f\r\n", whichVar, whichStruct[index]);
}
如何通过索引到结构直接存储? 我想使用类似的方法直接写地址
int* address = whichStruct + index;
*address = val;
您可以使用offsetof
宏来查找结构中的字节偏移量。 然后,您只需执行一些指针算法即可访问该字段。
*((float *) (((void *)&whichStruct) + offsetof(whichstruct, firstVar))) = val;
由于所有变量都是同一类型,因此这些字段将彼此相邻存储,并且它们之间没有间隙。 因此,您可以像这样在struct
索引:
void setParams(structType *whichStruct, const int whichVar, const float val) {
float *startVar = &(whichStruct->firstVar);
startVar[whichVar] = val;
printf("#%d = %f\r\n", whichVar, whichStruct[index]);
}
另一种方法是,以取代的个别字段struct
具有同等大小的阵列,并提供一个#define
为每个字段名称-d恒定。 这样,您的代码将反映相同的含义,并提供一种自然方式访问数组元素的方法。
dasblinkenlight的替代建议的更详尽的版本是我最喜欢做的事情之一。 您可以使用X宏对每个条目使用符号名来描述表。 X-Macro使您可以将符号剥离为enum
,然后使用其他数据初始化数组。 对表的编辑将保持符号关联(当然,除非您以某种方式将其弄乱,否则始终是可能的)。
#define FLOATTAB(_) \
_(FirstVar, 1.0) \
_(SecondVar, 2.0) \
/* end FLOATTAB */
#define FLOATTAB_NAME(a,b) a,
enum { FLOATTAB(FLOATTAB_NAME) };
#define FLOATTAB_DATA(a,b) b,
float ftab[] = { FLOATTAB(FLOATTAB_DATA) };
然后,您可以使用符号名称访问数据成员。
ftab[FirstVar];
这几乎和fstruct.FirstVar;
一样清晰fstruct.FirstVar;
,但将所有内容放入数组中,并且FirstVar
现在是一个索引,一个可以存储在变量中的小整数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.