2014-04-10 7 views
6

मैं stdlib.h से qsort उपयोग करते हैं,मैं एक चर को एक फ़ंक्शन में कैसे पास कर सकता हूं?

void qsort (void* base, size_t num, size_t size, 
      int (*compar)(const void*,const void*)); 
निम्नलिखित तरीके से

:

void myfun (float *arr, int n, float c) // value of c is changeable 
{ 
...// some code 
qsort(float *arr, n, sizeof(float), compareme); 
...// some code 
} 

int compareme (const void * a, const void * b) 
{ 
    float tmp = f((float*)a, (float*)b, c); // f is some function, and how can I pass c here? 
    if (tmp < 0) return -1; 
    if (tmp == 0) return 0; 
    if (tmp > 0) return 1; 
} 

साथ

कैसे मैं ccompareme यहाँ में प्रयोग करने योग्य बना सकते हैं?

धन्यवाद!

+0

आप नहीं कर सकते, क्योंकि [टैग: सी] व्याख्यात्मक रूप से स्कॉप्ड नहीं है। यदि आप [टैग: सी ++] पर स्विच कर सकते हैं, तो आप एक तुलना ऑब्जेक्ट बना सकते हैं, जिसमें 'c' शामिल है। –

+0

धन्यवाद, मैं केवल सी – Tim

उत्तर

4

कई (गंदा) वैश्विक चर का उपयोग करने के लिए कई उपाय हैं।

यह बहुत बुरा है कि qsort() में एक अतिरिक्त शून्य पॉइंटर तर्क शामिल नहीं है जो उपयोगकर्ता द्वारा आपूर्ति किए गए तुलना() फ़ंक्शन को पास किया गया है। मैंने इस सीमा को दूर करने के लिए अपना स्वयं का qsort() लिखना समाप्त कर दिया।

प्रोटोटाइप:

int myQsort(
    void *arrayBase, 
    size_t elements, 
    size_t elementSize, 
    int(*compar)(const void *, const void *, void *callerArg), 
    void *callerArg 
    ); 

यह मुझे मेरे compar() fn करने के लिए सभी (* शून्य करने के लिए डाली) संरचनाओं के प्रकार पारित करने के लिए अनुमति देता है।

+2

का उपयोग कर सकता हूं, मुझे लगता है कि यदि आप सुनिश्चित करते हैं कि यह थ्रेड स्थानीय है तो वैश्विक वैर ठीक हो सकता है। गैर-पोर्टेबल qsort_r http://man7.org/linux/man-pages/man3/qsort.3.html – this

4

आप Glibc का उपयोग कर कर रहे हैं तो (यानी, लिनक्स) आप qsort_r उपयोग कर सकते हैं:

int compareme (const void *a, const void *b, void *data) 
{ 
    float c = *(float *)data; 
    float tmp = f((float*)a, (float*)b, c); 
    if (tmp < 0) return -1; 
    if (tmp == 0) return 0; 
    if (tmp > 0) return 1; 
} 

तो

qsort_r(float *arr, n, sizeof(float), compareme, &c); 

फोन आप पूर्वप्रक्रमक मैक्रो निर्धारित करने के लिए है _GNU_SOURCEकिसी भी सहित से पहले यह कार्य प्राप्त करने के लिए हेडर इसे प्राप्त करने के लिए (जैसे -D_GNU_SOURCE), और यह आपके प्रोग्राम की पोर्टेबिलिटी को प्रतिबंधित करेगा।

अन्यथा, आपको वैश्विक या थ्रेड-स्थानीय स्टोरेज का उपयोग करना होगा, या अपना स्वयं का सॉर्ट फ़ंक्शन लिखना होगा।

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

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