Wednesday, 15 August 2012

"Grouping" enum values in C -


अगर मैं जैसे कुछ enums था

  typedef enum {AN_TRISTATE_0, AN_TRISTATE_1, AN_NOTHING, AN_MOTOR_1 , AN_MOTOR_2, AN_MOTOR_3, AN_SENSOR_1, AN_SENSOR_2, AN_SENSOR_3, AN_SENSOR_4, AN_SENSOR_5} adc_pin_func_t;   

और

  adc_pin_func_t a_particular_pin = ...   

, यह जांच लें कि क्या पिन है संभव होगा किसी विशेष समूह का हिस्सा, जैसे पिन, AN_MOTOR या AN_SENSOR का हिस्सा है, प्रत्येक संभव समूह में प्रत्येक आइटम के विरुद्ध जांचने के बजाय।

या क्या ऐसा करने के अधिक कुशल तरीके हैं, ईमानों के उपयोग के अलावा?

पहले से धन्यवाद

आप समूहों में से प्रत्येक के लिए मास्क बना सकते हैं:

  typedef enum {AN_TRISTATE_0 = 0x00001, AN_TRISTATE_1 = 0x00002, AN_TRISTATE_MASK = 0x0000f, AN_NOTHING = 0x00010, // इस 0x00000 होना चाहिए ? AN_MOTOR_1 = 0x00100, AN_MOTOR_2 = 0x00200, AN_MOTOR_3 = 0x00400, AN_MOTOR_MASK = 0x00f00, AN_SENSOR_1 = 0x01000, AN_SENSOR_2 = 0x02000, AN_SENSOR_3 = 0x04000, AN_SENSOR_4 = 0x08000, AN_SENSOR_5 = 0x10000, AN_SENSOR_MASK = 0xff000} adc_pin_func_t;   

और फिर बस का उपयोग कर मुखौटा के खिलाफ एक समूह & amp का परीक्षण; ऑपरेटर:

  अगर (a_particular_pin & amp; AN_SENSOR_MASK) {// यह एक संवेदक पिन है} और अगर (a_particular_pin & amp; AN_MOTOR_MASK) {// यह एक मोटर पिन है}   

संपादित करें: जैसा कि दूसरों ने एक श्रेणी का उपयोग करने का सुझाव दिया है, तब आप संभवत: बना सकते हैं परीक्षण के लिए एक मैक्रो, जो आपको कोड को बदलने की आवश्यकता के बिना परीक्षण कैसे किया जाता है, यह बदलने की अनुमति देगा: (<अच्छी तरह से): <पूर्व> #define IS_AN_SENSOR (x) ((( एक्स) & amp; AN_SENSOR_MASK) = 0) #define IS_AN_MOTOR (एक्स) (((एक्स) & amp; AN_MOTOR_MASK) = 0) // आदि

और फिर परीक्षण हो जाता है!: <पूर्व> यदि (आईएस_एएन_एसएनएनएसएएनएस (ए_पार्टीक्युलर_पिन)) {// यह एक सेंसर पिन है} और अगर (आईएस_एएनआईएमओटीओआर (ए_परिकुलर_पिन)) {// यह एक मोटर पिन है} // आदि

यदि आप फिर एक श्रेणी का उपयोग करने के लिए बदलना चाहते हैं तो केवल मैक्रो को बदलने की आवश्यकता है (और आपको स्पष्ट रूप से सीमा न्यूनतम / अधिकतम परिभाषित करना होगा):

  #define है एक _SENSOR (x) ((x) & gt; = AN_SENSOR_START & amp; amp; (X) & lt; = AN_SENSOR_END) // आदि    

No comments:

Post a Comment