2011-03-04 13 views
10

यदि मेरे पास छोटे स्ट्रिंग मानों का एक सेट है, और मैं उन्हें प्रतिनिधित्व करने के लिए एक संख्यात्मक मान प्राप्त करना चाहता हूं, तो लुकअप टेबल के माध्यम से ऐसा करने का सबसे अच्छा तरीका क्या है?तारों में सी में वैल्यू लुकअप टेबल?

मैं केवल एक सीधी नज़र अप करने के लिए की आवश्यकता होगी, कर रहे थे, मैं जानता हूँ कि इष्टतम समाधान सिर्फ बयान करता है, तो की एक श्रृंखला होगा:

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 शाखाओं को दोहराने के द्वारा कोड आकार को कम करने के लिए है, जो समग्र डिज़ाइन में थोड़ा अलग है, और बस किसी प्रकार का लुकअप फ़ंक्शन यह बताता है कि यह मान किस कार्य करता है।

+0

+1 स्थिरांक-शुद्धता के लिए ... * लेकिन झंडा किसी पूर्णांक (या enum) * – pmg

+0

आप एक [हैश फंक्शन] चाहते हैं (http://en.wikipedia.org/wiki/Hash_function के रूप में बेहतर है)। आपके स्ट्रिंग मानों के आधार पर यह पहले अक्षर के मान को वापस करने के समान सरल हो सकता है ... – pmg

+0

@pmg: अभी भी एक ही हैश के साथ कई तारों की संभावना है। छोटा, लेकिन यह है :) –

उत्तर

6

क्या आप केवल एक टेबल डालने पर विचार नहीं करते हैं? यदि बहुत सारी संपत्तियां हैं तो हैश टेबल भी ठीक है।

int lookup(const char *name) 
{ 
    typedef struct item_t { const char *name; int writable; int value; } item_t; 
    item_t table[] = { 
    { "foo", 0, FOO }, 
    { "bar", 1, BAR }, 
    { NULL, 0, 0 } 
    }; 
    for (item_t *p = table; p->name != NULL; ++p) { 
     if (strcmp(p->name, prop_name) == 0) { 
      return p->value; 
     } 
    } 
    return -EINVAL; 
}
+0

अच्छा समाधान। यदि आप केवल "बड़े और बदसूरत" कोड के बारे में चिंतित हैं, तो यह करना चाहिए, है ना? यदि तालिका लंबी है और आपका प्रोग्राम बहुत सारे लुक-अप करता है, तो मैं उस लूप पर काम करने की कोशिश करता हूं: उदा। एक बाइनरी-सर्च-कार्यान्वयन की तलाश करें जो तारों पर लागू होती है और निश्चित रूप से सी में लिखी जाती है। – AudioDroid

+1

@AudioDroid: इसके बारे में बड़ा और बदसूरत क्या है? यह सरल और समझदार और काफी मजबूत है और मैंने इसे कई स्थानों पर उपयोग किया है। एल्गोरिदम ओ (एन) है जो लंबी सूचियों के लिए एक समस्या हो सकती है। हालांकि, क्या यह एक समस्या है प्रदर्शन प्रदर्शन के साथ निर्धारित किया जाना चाहिए, अनुमान लगाने के लिए नहीं। – JeremyP

+0

मैं व्यक्तिगत रूप से इस तरह के समाधान को कुछ भी लेकिन छोटी सूची के लिए हतोत्साहित करता हूं। इस तरह तारों का उपयोग करते समय, लोकेल और केस-सेंसिटीविटी का मुद्दा समस्याग्रस्त हो सकता है। इसके अलावा, दक्षता पर संदेह है।एक strcmp एक हैश कुंजी की तुलना पर्याप्त होने पर बार-बार तुलना की अनुक्रम का तात्पर्य है। एक strcmp के खिलाफ हैशिंग के प्रदर्शन की तुलना करते समय, हैश विधि सभी के लिए बेहतर प्रदर्शन दिखाती है लेकिन छोटी सूची (मेरे अनुभव में)। – Throwback1986

संबंधित मुद्दे