如果你想
int getval(struct Element *ep, int n)
和名称:
0123使用这两种元素索引来访问你的结构
然后你坚持一些难以维护的开关像每个人都建议的方法。
但是,如果您想要做的只是按索引访问而不按名称访问,那么您可以更有创意。
首先,定义一个字段类型:
typedef struct _FieldType
{
int size_in_bits;
} FieldType;
然后创建一个结构的定义:
FieldType structure_def [] = { {1}, {1}, {1}, {4}, {1}, {0} };
上面定义了尺寸1,1,1,4的五行的结构和1位。最后的{0}标志着定义的结束。
现在创建一个元素类型:
typedef struct _Element
{
FieldType *fields;
} Element;
要创建Element
的一个实例:
Element *CreateElement (FieldType *field_defs)
{
/* calculate number of bits defined by field_defs */
int size = ?;
/* allocate memory */
Element *element = malloc (sizeof (Element) + (size + 7)/8); /* replace 7 and 8 with bits per char */
element->fields = field_defs;
return element;
}
然后访问一个元素:
int GetValue (Element *element, int field)
{
/* get number of bits in fields 0..(field - 1) */
int bit_offset = ?;
/* get char offset */
int byte_offset = sizeof (Element) + bit_offset/8;
/* get pointer to byte containing start of data */
char *ptr = ((char *) element) + byte_offset;
/* extract bits of interest */
int value = ?;
return value;
}
设定值是相似为了获得价值,只有最后一部分需要改变。
您可以通过扩展FieldType
结构来增强上述结构以包含有关所存储值的类型的信息:char,int,float等等,然后为每种类型编写访问器,用于根据定义的类型检查所需的类型。
恐怕我们应该关心是否有位字段:你不能定义一个指向位字段成员的指针,而数组访问方式意味着指针处理。 – mouviciel 2009-05-20 13:45:39