如果你想
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