दिलचस्प पोस्ट
मैं ईएफ डीबीसीॉन्टेक्स मेटाडेटा प्रोग्राम को कैसे पढ़ सकता हूं? कैसे टाईमजोन को अजगर में एक निष्क्रिय दिनांक समय आवृत्ति में जोड़ना लंबे स्ट्रिंग से ईमेल पता कैसे प्राप्त करें कई भाषाएं संवेदनशील क्यों हैं? विभिन्न लॉग स्तरों का उपयोग कब किया जाए JSONObject का उपयोग करके जावा में सही JsonArray कैसे बनाया जाए जावा में "11 वीं", "21 वीं" या "23 वां" कहने के लिए महीने के दिन आप कैसे प्रारूपित करते हैं? (क्रमिक सूचक) एक वेब पेज की सामग्री (AJAX कॉल के माध्यम से लोड) लाएं WindowsFormsHost हमेशा WPF तत्व से सबसे ऊपर है मेज लॉक किए बिना वैकल्पिक टेबल? एंड्रॉइड में एडिट टेस्ट दृश्य में बहु-लाइन की अनुमति दें? नाम क्या है, और यह कैसे काम करता है? SSL / कीस्टोर के साथ जावा में एक Websphere MQ से कनेक्ट करना उबुंटू 14.04, पाइप मैप्लेटलिब का उन्नयन नहीं कर सकता ASP.NET वेब अनुप्रयोग संदेश बॉक्स

सी ++ में कास्टिंग पॉइंट पॉइंटर्स

मेरे पास एक शून्य सूचक है जो dlsym () द्वारा वापस आ गया है, मैं शून्य सूचक द्वारा इंगित फ़ंक्शन कॉल करना चाहता हूं। इसलिए मैं कास्टिंग द्वारा एक प्रकार का रूपांतरण करता हूं:

void *gptr = dlsym(some symbol..) ; typedef void (*fptr)(); fptr my_fptr = static_cast<fptr>(gptr) ; 

मैंने भी reinterpret_cast की कोशिश की है, लेकिन कोई भाग्य नहीं है, हालांकि सी कास्ट ऑपरेटर काम करने लगता है ..

Solutions Collecting From Web of "सी ++ में कास्टिंग पॉइंट पॉइंटर्स"

सी ++ 98/03 में किसी void* को फ़ंक्शन पॉइंटर में सीधे परिवर्तित करने की अनुमति नहीं है (किसी भी कास्ट का उपयोग करके संकलित नहीं करना चाहिए) यह सशर्त रूप से सी ++ 0x में समर्थित है (एक कार्यान्वयन व्यवहार को परिभाषित करने का चयन कर सकता है और यदि वह इसे परिभाषित करता है तो मानक को ऐसा करना चाहिए जो उसे करना चाहिए। एक void* , जैसा कि C ++ 98/03 मानक, वस्तुओं को इंगित करना था और फ़ंक्शन पॉइंटर्स या सदस्य पॉइंटर्स को शामिल नहीं करना था

यह जानते हुए कि आप जो कर रहे हैं, भारी कार्यान्वयन निर्भर है, यहां एक विकल्प है, जो कि ज्यादातर प्लेटफार्मों पर संकलित और काम (32 बिट पॉइंटर्स मानते हुए, 64 बिट के लिए लंबे समय तक उपयोग करते हैं), हालांकि यह स्पष्ट रूप से मानक के अनुसार अनिर्धारित व्यवहार है:

 void *gptr = dlsym(some symbol..) ; typedef void (*fptr)(); fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr)) ; 

और यहां एक और विकल्प है जिसे संकलन और काम करना चाहिए, लेकिन इसके साथ ही उसी चेतावनी को ऊपर दिया गया है:

 fptr my_ptr = 0; *reinterpret_cast<void**>(&my_ptr) = gptr; 

या, धीमी गति में …

 // get the address which is an object pointer void (*(*object_ptr))() = &my_ptr; // convert it to void** which is also an object pointer void ** ppv = reinterpret_cast<void**>(object_ptr); // assign the address in the memory cell named by 'gptr' // to the memory cell that is named by 'my_ptr' which is // the same memory cell that is pointed to // by the memory cell that is named by 'ppv' *ppv = gptr; 

यह अनिवार्य रूप से इस तथ्य का लाभ उठाता है कि फ़ंक्शन पॉइंटर का पता एक ऑब्जेक्ट पॉइंटर है [void (*(*object_ptr))()] – तो हम इसे किसी दूसरे ऑब्जेक्ट पॉइंटर में बदलने के लिए reinterpret_cast का उपयोग कर सकते हैं: जैसे void** । इसके बाद हम वास्तविक फ़ंक्शन पॉइंटर को रिक्त स्थान (शून्य ** को संदर्भित करके) के पते का पालन कर सकते हैं और वहां जीपीटीआर के मूल्य को स्टोर कर सकते हैं।

yuk – कोई भी तरह से अच्छी तरह से परिभाषित कोड नहीं है – लेकिन ऐसा करना चाहिए जो आप अपेक्षा करते हैं कि यह अधिकांश कार्यान्वयनों पर करना है।

ध्यान दें कि C ++ 11 ऐसे रूपांतरण की अनुमति देता है और जीसीसी 4.9 से ऊपर और इस रूपांतरण से ऊपर चेतावनी नहीं उत्पन्न होती है: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57869

देखें तो चर्चाएं:

  • सी और सी ++ में पॉइंटर-टू-फंक्शन और पॉइंटर-टू-ऑब्जेक्ट के बीच काटता है
  • फ़ंक्शन पॉइंटर्स और डेटा पॉइंटर्स सी / सी ++ में असंगत क्यों हैं?
  • शून्य * फंक्शन पॉइंटर को स्टोर करने के लिए इस्तेमाल किया जा सकता है?
  • शून्य के लिए फ़ंक्शन डालने के लिए reinterpret_cast का उपयोग करना *, यह अवैध क्यों नहीं है?

यह दृश्य स्टूडियो में पुन: संदर्भित न किए बिना उपयोग करता है:

 void *ptr; int (*func)(void) = (int(*)(void))ptr; int num = func(); 

मुझे यह (थोड़ा बदसूरत) समाधान मिला अधिकतम चेतावनी स्तर के साथ जीसीसी शिकायत नहीं करता है। यह उदाहरण dlsym () को कॉल करता है (जो शून्य * देता है) और फ़ंक्शन पॉइंटर में परिणाम देता है।

 typedef void (*FUNPTR)(); FUNPTR fun_dlsym(void* handle, const char* name) { union { void* ptr; FUNPTR fptr; } u; u.ptr = dlsym(handle, name); return u.fptr; } 

यह आपकी मदद कर सकता है यह "हैलो" प्रिंट करता है

 #include <iostream> void hello() { std::cout << "Hello" << std::endl; } int main() { typedef void (*fptr)(); fptr gptr = (fptr) (void *) &hello; gptr(); } 

या आप ऐसा कर सकते हैं:

 fptr gptr = reinterpret_cast<fptr>( (void *) &hello); 

जहां और नमस्ते dlsym आदेश द्वारा प्रतिस्थापित किया जाता है