यदि मेरे पास छोटे स्ट्रिंग मानों का एक सेट है, और मैं उन्हें प्रतिनिधित्व करने के लिए एक संख्यात्मक मान प्राप्त करना चाहता हूं, तो लुकअप टेबल के माध्यम से ऐसा करने का सबसे अच्छा तरीका क्या है?तारों में सी में वैल्यू लुकअप टेबल?
मैं केवल एक सीधी नज़र अप करने के लिए की आवश्यकता होगी, कर रहे थे, मैं जानता हूँ कि इष्टतम समाधान सिर्फ बयान करता है, तो की एक श्रृंखला होगा:
if (strcmp(str, "foo") == 0)
tmp = FOO;
else if (strcmp(str, "bar") == 0)
tmp = BAR;
लेकिन, मैं इस पूछना क्योंकि इन छोटे स्ट्रिंग मान एक विशेषता का प्रतिनिधित्व एक छोटी परियोजना में मैं सी में लिख रहा हूं, और विशेषताओं को केवल पढ़ने या पढ़ने-लिखने के लिए पढ़ा जा सकता है (केवल अब के लिए कोई लिखना नहीं, शायद कभी नहीं)।
तो मैं वर्तमान में यह सुनिश्चित करने के लिए क्या करता हूं कि चीजें काम करने के लिए एक लुकअप फ़ंक्शन होता है, जिसमें उपरोक्त की तरह एक if-then खंड शामिल होता है, यह देखने के लिए कि कौन से मान केवल पढ़े जाते हैं, और दूसरा फ़ंक्शन जो देखता है कि कौन से मान पढ़े जाते हैं -लिखना। लेकिन यह मेरे लिए बड़ा और बदसूरत है।
मैं सोच रहा हूं, इसके बजाय तीन कार्य हैं। एक फ़ंक्शन लुकअप फ़ंक्शन है, और यह एक int मान देता है जो स्ट्रिंग का अंकीय रूप है। लेकिन यह लुकअप फ़ंक्शन एक झंडा भी ले सकता है जो यह निर्धारित करता है कि यह केवल पढ़ने-योग्य मान, या रीड-राइट मान प्राप्त करता है या नहीं। यदि एक मान पर एक लिखने का ऑपरेशन किया जाता है जो वास्तव में केवल पढ़ने के लिए होता है, तो फ़ंक्शन वापस आ जाएगा- EINVAL (या समकक्ष कुछ)।
अन्य दो कार्य, अब भी पढ़ और लिखते हैं, बस इस लुकअप फ़ंक्शन को कॉल करें, मूल्य की एक स्ट्रिंग में गुजरते हुए, और ध्वज जो निर्धारित करता है कि वे पढ़ने या लिखने के लिए हैं या नहीं।
बात यह है कि मुझे नहीं पता कि यह सी में मॉडलिंग कैसे किया जाता है (यदि इसे मॉडलिंग किया जा सकता है), और Google को खोजना इस सामग्री को बंद करने वाले सभी सामग्री खेतों के साथ थकाऊ है (और मुझे इसके बजाय सी ++/सी # उत्तर दे रहा है) ।
int lookup_func(const char *name, const char *flag) {
int tmpval = 0;
/* code to do the lookup. */
if (tmpval == 0)
return -EINVAL;
else
return tmpval;
}
int get_readonly_bit(const char *name) {
return lookup_func(name, "ro");
}
int get_readwrite_bit(const char *name) {
return lookup_func(name, "rw")
}
विचार:
तो यह मैं कैसे लगता है कि यह गौर करेंगे है? विचार इन दो कार्यों के लिए if-then शाखाओं को दोहराने के द्वारा कोड आकार को कम करने के लिए है, जो समग्र डिज़ाइन में थोड़ा अलग है, और बस किसी प्रकार का लुकअप फ़ंक्शन यह बताता है कि यह मान किस कार्य करता है।
+1 स्थिरांक-शुद्धता के लिए ... * लेकिन झंडा किसी पूर्णांक (या enum) * – pmg
आप एक [हैश फंक्शन] चाहते हैं (http://en.wikipedia.org/wiki/Hash_function के रूप में बेहतर है)। आपके स्ट्रिंग मानों के आधार पर यह पहले अक्षर के मान को वापस करने के समान सरल हो सकता है ... – pmg
@pmg: अभी भी एक ही हैश के साथ कई तारों की संभावना है। छोटा, लेकिन यह है :) –