2016-01-23 7 views
5

मेरे पास एक ऐसा फ़ंक्शन है जो एक सरणी की जांच करता है और जांच सफल होने पर सरणी अनुक्रमणिका देता है।फ़ंक्शन लौटने के लिए त्रुटि कोड वापस करने का सही तरीका आकार_t

मेरे कोड में मैंने स्पष्टता के लिए एक एरे इंडेक्स type_t से संबंधित प्रत्येक प्रकार बनाया है।

इस फ़ंक्शन के लिए उस स्पष्टता को बनाए रखने का पसंदीदा तरीका क्या है? क्या मुझे एक त्रुटि चर के लिए पॉइंटर तर्क लेना चाहिए और उसे सेट करना चाहिए?

inline size_t 
lin_search(const double *pxa, const double x, const size_t idxlow, const size_t idxhigh) 
{ 
    for (size_t i = idxlow; i < idxhigh; i++) 
    { 
     if (pxa[i] <= x && pxa[i+1] > x) 
      return i; 
    } 

    return -1; // If I change the return type to f.ex long int this works 
       // but I am no longer consistent 

} 

तो मैं इस तरह

index = linsearch(parray, x, 0, n - 1); 
if (index == -1) 
    ... not found 
+0

क्या आप अपने कार्यों को इसके बजाय (हस्ताक्षरित) 'ssize_t' पर स्विच कर सकते हैं? –

+0

मेरे पास 'ssize_t' नहीं है। विफलता का संकेत देने के लिए आप 'SIZE_MAX' वापस कर सकते हैं? –

+0

'ssize_t' मानक सी नहीं है (यह POSIX है)। हालांकि, सी में 'ptrdiff_t' है। उस ने कहा, '(size_t) -1' (AFAIK) हमेशा' SIZE_MAX' होने के लिए परिभाषित किया गया है; कोई शायद '# परिभाषित LIN_SEARCH_ERR ((size_t) -1)' या इसी तरह का उपयोग कर सकता है। –

उत्तर

4

एक size_t "खो" बिना दूसरी तरह के एक बूलियन के रूप में सूचक और वापसी कोड में सूचकांक मान देने के लिए है (size_t सरणी अनुक्रमणिका के लिए सही प्रकार है) आप कॉल कर सकते हैं:

size_t index; 

if (lin_search(...., &index)) { 
    /* use 'index' */ 
} 

इस तरह, आप size_t के अलावा कुछ और समारोह वापसी प्रकार का उपयोग कर के साथ समझौता करने की जरूरत नहीं है अभी भी है कि क्या सूचकांक का कहना है पाया जाता है।

+0

मुझे लगता है कि यह चीजों को बहुत संगत रखता है, सुझावों के लिए धन्यवाद – luffe

+0

एक और लघु शैली का सवाल जो शायद एक नया सवाल पूछता नहीं है: मेरे प्रोटोटाइप में मैं प्रत्येक पैरामीटर में 'const' जोड़ता हूं जिसे मैं बदलने का इरादा नहीं रखता हूं, यहां तक ​​कि उन मानों के लिए भी कि 'सी' डिफ़ॉल्ट रूप से प्रतिलिपि मूल्य से गुजरता है (यानी 'int') इस 'एफएन (कॉन्स डबल एक्स)' की तरह: क्या यह अच्छा अभ्यास है? धन्यवाद फिर से – luffe

+0

@luffe यह हानिरहित है। लेकिन मैं व्यक्तिगत रूप से नहीं सोचता कि यह किसी भी तरह से उपयोगी है। देखें: http://stackoverflow.com/questions/1724051/const-correctness-for-value-parameters और –

1

हालात के रूप में उपयोग कर सकता है अनसुना नहीं कर रहे हैं। fgetc की परिभाषा है, जो वर्ण पढ़ता है, उदाहरण के लिए ले लो:

int fgetc(FILE *stream); 

fgetc() धारा से अगले वर्ण पढ़ता है और किसी पूर्णांक पर के रूप में यह रिटर्न एक अहस्ताक्षरित चार डाली, या फ़ाइल के अंत पर या EOF त्रुटि।

यह समारोह एक मूल्य है कि unsigned char सफलता पर करने के लिए डाली जा सकती है, देता है, और यह विफलता पर EOF (आमतौर पर -1) लौट आते हैं।

एक और उदाहरण ftell जो वर्तमान एक फ़ाइल में ऑफसेट की रिपोर्ट है,:

long ftell(FILE *stream); 

सफल समापन पर, ... ftell() वर्तमान ऑफसेट देता है। अन्यथा, -1 वापस आ गया है और त्रुटि त्रुटि को इंगित करने के लिए सेट है।

फ़ाइल ऑफसेट हमेशा गैर नकारात्मक हैं, तो एक नकारात्मक मूल्य लौटने त्रुटियां रिपोर्ट कर रहे हैं है।

तो मुझे लगता है कि रिटर्न प्रकार को बदलकर long इस तरह के मामले के लिए स्वीकार्य होगा।

bool 
    lin_search(...., size_t *index) { 
     bool found = false; 

     for (size_t i = idxlow; i < idxhigh; i++) { 
      if (pxa[i] <= x && pxa[i+1] > x) { 
       found = true; 
       *index = i; 
       break; 
      } 
     } 

    return found; 
} 

और:

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