2013-03-09 3 views
6

तो मैं अपने सी ++ ऐप में इस सी लाइब्रेरी का उपयोग कर रहा हूं, और फ़ंक्शंस में से एक शून्य शून्य * देता है। अब मैं शुद्ध सी के साथ सबसे तेज नहीं हूं, लेकिन सुना है कि एक शून्य * किसी भी अन्य *-प्रकार के लिए बहुत अधिक जा सकता है। मुझे यह भी पता है कि मैं इस समारोह से कहीं अंत में एक फ्लोट की उम्मीद करता हूं।शून्य * सचमुच फ्लोट है, कैसे कास्ट किया जाए?

तो मैंने शून्य * को एक फ्लोट * पर गिरा दिया और फ्लोट *, क्रैश को कम किया। रफ़ू !. मैं कोड डीबग करता हूं और जीडीबी में इसे (float)voidPtr का मूल्यांकन करने देता हूं और कम मानता है और मूल्य वह है जो मुझे उम्मीद है और चाहिए!

लेकिन प्रतीक्षा करें, संकलन समय के दौरान यह असंभव है। अगर मैं float number = (float)voidPtr; लिखता हूं तो यह संकलित नहीं होता है, जो समझ में आता है।

तो अब सवाल, मैं इस फ्राइंग शून्य से अपना फ्लोट कैसे प्राप्त करूं *?

संपादित करें: एच 2CO3 के लिए धन्यवाद यह हल हो गया था, लेकिन मुझे लगता है कि मैं बहुत सारे उत्तरों और टिप्पणियों को प्रकट नहीं कर रहा हूं और यह विश्वास नहीं कर रहा हूं कि मैं जीडीबी में voidPtr कर सकता हूं। यहां स्क्रीनशॉट है।

enter image description here

+2

बेशक, इस तरह की स्थिति में एक बेहतर समाधान समाप्त नहीं हो रहा है। – delnan

+3

@ डेलनान, तो ओपी को पूरी लाइब्रेरी पर छोड़ देना चाहिए क्योंकि यह शून्य पॉइंटर्स का उपयोग करता है? –

+1

@CoreyOgburn नहीं, मैं एक शून्य पॉइंटर के रूप में व्याख्या किए जाने वाले गैर-सूचक के बारे में बात कर रहा हूं। कुछ मामलों में 'शून्य *' बिल्कुल ठीक है, लेकिन ओपी के मामले में, कहीं कहीं खराब हो गया है। शायद ओपी लाइब्रेरी गलत का उपयोग कर रहा है। – delnan

उत्तर

12

संकेत उपयोग करके देखें:

void *theValueAsVoidPtr = // whatever 

float flt = *(float *)&theValueAsVoidPtr; 
+8

ध्यान दें कि यह मानता है कि 'आकार (फ्लोट) == आकार (शून्य *)' जो सत्य नहीं हो सकता है, और उस स्थिति में यह अपरिभाषित व्यवहार का आह्वान करता है। –

+1

यह काम करता है, मैं अतिरिक्त और गायब था। निश्चित नहीं है कि यह वास्तव में क्या होता है या क्यों, लेकिन यह काम करता है। धन्यवाद। – xNidhogg

+1

@xNidhogg स्पष्टीकरण: पॉइंटर्स की प्रकार की सुरक्षा गैर-पॉइंटर्स से कमजोर है। आप 'शून्य *' को 'फ्लोट' पर नहीं डाल सकते हैं, लेकिन आप 'शून्य **' 'float *' पर डाल सकते हैं। अब जब आप ऐसा करते हैं, और 'theValueAsVoidPtr' चर के पते को अव्यवस्थित करते हैं, तो आपको उस चर के * सामग्री * को मिलता है, बस किसी अन्य प्रकार में - इसे टाइप पनिंग कहा जाता है। [बुराई फ़्लोटिंग-पॉइंट बिट लेवल हैकिंग "] के साथ चिह्नित लाइन देखें (http://en.wikipedia.org/wiki/Fast_inverse_square_root#Overview_of_the_code)। –

8

अगर मैं सही ढंग से समझ, अपने पुस्तकालय एक चर जिसका घोषित प्रकार void * है में एक नाव मूल्य लौटा रहा है। सबसे सुरक्षित तरीका इसे वापस बाहर फिर से पाने के लिए एक union साथ है:

#include <assert.h> 
static_assert(sizeof(float) == sizeof(void *)); 

union extract_float { 
    float vf; 
    void * vp; 
}; 

float foo(...) 
{ 
    union extract_float ef; 
    ef.vp = problematic_library_call(...); 
    return ef.vf; 
} 

स्वीकार किए जाते हैं जवाब में दृष्टिकोण के विपरीत, इस अपरिभाषित व्यवहार को गति प्रदान नहीं करता है।

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