मेरे पास एक ऐसा फ़ंक्शन है जो स्ट्रिंग, तारों की एक सरणी और पॉइंटर्स की एक सरणी लेता है, और तारों की सरणी में स्ट्रिंग को देखता है, और पॉइंटर्स की सरणी से संबंधित पॉइंटर देता है। चूंकि मैं इसे कई अलग-अलग चीजों के लिए उपयोग करता हूं, पॉइंटर सरणी को (शून्य *) की सरणी के रूप में घोषित किया जाता है, और कॉलर को पता होना चाहिए कि वास्तव में किस प्रकार के पॉइंटर्स हैं (और इसलिए रिटर्न वैल्यू के रूप में यह किस प्रकार का पॉइंटर वापस आता है)।मैं फ़ंक्शन पॉइंटर को (शून्य *) क्यों नहीं डाल सकता?
जब मैं समारोह संकेत की एक सरणी में पारित, फिर भी, मैं एक चेतावनी है जब मैं -Wpedantic
साथ संकलन मिलती है:
बजना:
test.c:40:8: warning: assigning to 'voidfunc' (aka 'void (*)(void)') from 'void *' converts
between void pointer and function pointer [-Wpedantic]
जीसीसी:
test.c:40:8: warning: ISO C forbids assignment between function pointer and ‘void *’ [-Wpedantic]
fptr = find_ptr("quux", name_list, (void **)ptr_list,
यहाँ एक है परीक्षण फ़ाइल, जो चेतावनी के बावजूद सही ढंग से "quux" प्रिंट करती है:
#include <stdio.h>
#include <string.h>
void foo(void)
{
puts("foo");
}
void bar(void)
{
puts("bar");
}
void quux(void)
{
puts("quux");
}
typedef void (* voidfunc)(void);
voidfunc ptr_list[] = {foo, bar, quux};
char *name_list[] = {"foo", "bar", "quux"};
void *find_ptr(char *name, char *names[], void *ptrs[], int length)
{
int i;
for (i = 0; i < length; i++) {
if (strcmp(name, names[i]) == 0) {
return ptrs[i];
}
}
return NULL;
}
int main() {
voidfunc fptr;
fptr = find_ptr("quux", name_list, (void **)ptr_list,
sizeof(ptr_list)/sizeof(ptr_list[0]));
fptr();
return 0;
}
क्या -Wpedantic
के साथ संकलित नहीं करने के अलावा चेतावनी को ठीक करने का कोई तरीका है, या मेरे find_ptr फ़ंक्शन को डुप्लिकेट करना, फ़ंक्शन पॉइंटर्स के लिए और एक बार गैर-फ़ंक्शन पॉइंटर्स के लिए? क्या मैं जो करने की कोशिश कर रहा हूं उसे हासिल करने का एक बेहतर तरीका है?
आईआईआरसी मुद्दा यह है कि कोड पॉइंटर्स डेटा पॉइंटर्स के समान आकार के समान नहीं हो सकते हैं। अधिकांश आर्किटेक्चर में वे हैं। सी मानक के संदर्भ को खोजने के लिए मैं इसे किसी और को छोड़ दूंगा। आप शायद 'uintptr_t' और पीछे के माध्यम से कास्टिंग करके इच्छित परिणाम प्राप्त कर सकते हैं। – abligh
@ पॉली द्वारा वर्णित संभावित आकार मिलान के कारण फ़ंक्शन पॉइंटर्स को अन्य पॉइंटर प्रकारों में डालने के लिए यह अनिर्धारित व्यवहार है अधिक जानकारी के लिए यह प्रश्न देखें: http://stackoverflow.com/questions/13696918/c-cast-void-pointer-to -फंक्शन-पॉइंटर – erdeszt
आपको 'void * ptrs []' 'voidfunc * ptrs' द्वारा प्रतिस्थापित करने से क्या रोकता है? – alk