आप चाहते हैं
int getval(struct Element *ep, int n)
और नाम से:
दोनों तत्व सूचकांक का उपयोग कर अपने संरचना का उपयोग
तो आप स्विच को बनाए रखने के लिए कुछ कठिन परिश्रम कर रहे हैं जैसे हर किसी ने सुझाव दिया है।
यदि, हालांकि, आप जो करना चाहते हैं वह इंडेक्स द्वारा एक्सेस और कभी भी नाम से नहीं है, तो आप थोड़ा अधिक रचनात्मक हो सकते हैं।
सबसे पहले, एक क्षेत्र के प्रकार को परिभाषित:
typedef struct _FieldType
{
int size_in_bits;
} FieldType;
और फिर एक संरचना परिभाषा बनाने के लिए:
FieldType structure_def [] = { {1}, {1}, {1}, {4}, {1}, {0} };
ऊपर आकार 1, 1, 1, 4 के पांच तत्वों के साथ एक संरचना को परिभाषित करता है और 1 बिट्स। अंतिम {0} परिभाषा के अंत को चिह्नित करता है। एक तत्व
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;
}
और फिर उपयोग करने के लिए:
typedef struct _Element
{
FieldType *fields;
} Element;
एक 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