मैं एक सामान्य एकल लिंक वाली सूची को कार्यान्वित कर रहा हूं जहां सूची नोड्स अपने डेटा में एक पॉइंटर स्टोर करते हैं।क्या सामान्य तर्कों के साथ फ़ंक्शन पॉइंटर पास करने का कोई तरीका है?
typedef struct sll_node
{
void *data;
struct sll_node *next;
} sll_node;
एक सामान्य खोज सबरूटीन कि डेटा के किसी भी प्रकार के साथ काम करता लागू करने के लिए, मैं इतना है कि यह एक तर्क के रूप तुलना कार्य करने के लिए एक समारोह सूचक ले जाता है इस प्रकार के रूप में यह लिखा है:
/* eq() must take 2 arguments. ex: strcmp(char *, char *) */
sll_node *sll_find(void *data, int (*eq)(), sll_node *root);
आप कर सकते हैं उपयुक्त फ़ंक्शन पॉइंटर को पास करें जो डेटा प्रकार के साथ काम करता है .. इसलिए यदि आप सूची नोड्स में तारों को स्टोर करते हैं, तो आप eq() फ़ंक्शन के रूप में strcmp को पास कर सकते हैं, और इसी तरह। यह काम करता है लेकिन मैं अभी भी संतुष्ट नहीं हूं ..
क्या इसकी सामान्यता को छोड़ दिए बिना तुलनात्मक फ़ंक्शन पैरामीटर की संख्या स्पष्ट रूप से निर्दिष्ट करने का कोई तरीका है?
मैं पहली बार में यह करने की कोशिश की:
sll_node *sll_find(void *data, int (*eq)(void *, void *), sll_node *root);
मैं यह काम करने की उम्मीद। लेकिन नहीं (संपादित करें: यह एक चेतावनी के साथ संकलित करता है लेकिन मेरे पास है - वार्ता!), मुझे ईआर प्रोटोटाइप के अनुरूप बनाने के लिए स्ट्रैम्प के चारों ओर एक रैपर फ़ंक्शन लिखना पड़ा।
मैं तो कोशिश की:
sll_node *sll_find(void *data, int (*eq)(a, b), sll_node *root);
या:
typedef int (*equality_fn)(a, b);
sll_node *sll_find(void *data, equality_fn eq, sll_node *root);
जो दोनों संकलन नहीं होता के बाद से:
तुलना फ़ंक्शन आमतौर पर 'const' कीवर्ड के साथ घोषित किए जाते हैं, उदा। 'int (* eq) (कॉन्स शून्य *, कॉन्स शून्य *)'। क्या यह 'strcmp' के साथ समस्या को ठीक करता है? – user3386109
पॉइंटर के प्रकार को कास्ट करने के लिए पैरामीटर की आवश्यकता होती है; अपने मामले में, शायद टिल नल लूपिंग का प्रयास करें? –
@ user3386109 आप ** कॉन्स ** कीवर्ड (बेवकूफ दृष्टिकोण से) के बारे में सही हैं, लेकिन यह अभी भी वही चेतावनी देता है: ** चेतावनी: असंगत सूचक प्रकार 'int (const char *, const char *) 'प्रकार के पैरामीटर' int (*) (शून्य *, शून्य *) '[-विंकुम्पेबल-पॉइंटर-प्रकार] ** (मैंने स्पष्टीकरण के लिए प्रश्न संपादित किया) –