2011-05-23 7 views
16

जीआईएल के लिए डिजाइन दिशानिर्देशों द्वारा काम करने की कोशिश कर रहा है, मैं अपने चैनल डेटा प्रकारों के लिए bits__ का उपयोग करता हूं। मेरे पास अक्सर बाहरी डेटा होता है जिसे मैं जीआईएल छवि दृश्यों में लपेट रहा हूं। हालांकि, डेटा पॉइंटर्स के लिए bits__ प्रकारों का उपयोग करने के लिए भी, मुझे अपनी छवि दृश्य बनाने से पहले मुझे reinterpret_cast में जोड़ना होगा। 'आरंभ':: निम्नलिखित कोडबूस्ट :: जीआईएल बिट्स 8 * ग्रे 8_ptr_t पर reinterpret_cast के बिना?

int width = 3; 
int height = 2; 

boost::gil::bits8 data8[] = {0, 1, 100, 200, 50, 51}; 
boost::gil::bits8* pBits8 = data8; 
boost::gil::gray8_ptr_t pGray8 = pBits8; 

boost::gil::gray8_view_t v = interleaved_view(width, height, pGray8, width * sizeof(boost::gil::bits8)); 

"लाइन 6 पर त्रुटि C2440 त्रुटि में परिणाम ले लो 'को बढ़ावा देने :: गिल :: bits8 *' से परिवर्तित नहीं कर सकते करने के लिए 'को बढ़ावा देने :: गिल :: gray8_ptr_t' 1> इंगित किए गए प्रकार असंबद्ध हैं; रूपांतरण की आवश्यकता है reinterpret_cast, सी-स्टाइल कास्ट या फ़ंक्शन-स्टाइल कास्ट "

जितना संभव हो उतना स्रोत कोड में पहुंचा, ऐसा लगता है कि इन प्रकारों को वास्तव में बिना रिलीज़ किया गया है। बिट्स 8 सिर्फ unsigned char है, लेकिन gray8_ptr_tstruct pixel<bits8,gray_layout_t> पर एक पॉइंटर है। इस संरचना का एकमात्र तत्व एक बिट्स 8 है, इसलिए एक reinterpret_cast सुरक्षित दिखता है। यह उन परीक्षणों के लिए भी ठीक काम करता है जिन्हें मैंने फेंक दिया है।

हालांकि, मैं बाहरी डेटा को अक्सर छवि दृश्यों में लपेटता हूं, और हर जगह एक reinterpret_cast होने से समस्याग्रस्त लगता है। जीआईएल में उपयोग के लिए पिक्सेल पॉइंटर बनाने का कोई सुरक्षित तरीका है?

वर्तमान वैकल्पिक हल:

template<class Dest, class Src> 
Dest gil_safe_ptr_cast(Src src) 
{ 
    // this cast is unsafe, use reinterpret_cast 
    BOOST_STATIC_ASSERT(false); 
} 
template<> boost::gil::gray8_ptr_t gil_safe_ptr_cast(boost::gil::bits8* pBits8) 
{ 
    return reinterpret_cast<boost::gil::gray8_ptr_t>(pBits8); 
} 
boost::gil::bits8* pBits8 = data8; 
boost::gil::gray8_ptr_t pGray8 = gil_safe_ptr_cast<boost::gil::gray8_ptr_t>(pBits8); // works 
boost::gil::bits16* pBits16 = NULL; 
boost::gil::gray8_ptr_t pGray82 = gil_safe_ptr_cast<boost::gil::gray8_ptr_t>(pBits16); // compile error as expected 
+0

+1 खतरनाक जानवरों के बारे में पूरी तरह से पागल नहीं होने के कारण, जैसा कि मुझे संदेह है कि जब आप पहली बार प्रश्न शीर्षक पढ़ते हैं तो हो सकता है। –

+1

मैंने चारों ओर एक काम बनाया है, जो मूल रूप से उन परिसरों की एक सूची है जो इस ऑपरेशन के लिए सुरक्षित होने के लिए जाने जाते हैं – totowtwo

+2

यदि आपने अभी पिक्सेल स्ट्रक्चर बनाया है और बस इसमें बिट्स 8 रखा है तो यह सुरक्षित होगा। रिवर्स रूपांतरण के लिए, बस संरचना से बिट्स 8 निकालें। –

उत्तर

1
template<class Dest, class Src> 
Dest gil_safe_ptr_cast(Src src) 
{ 
    // this cast is unsafe, use reinterpret_cast 
    BOOST_STATIC_ASSERT(false); 
} 
template<> boost::gil::gray8_ptr_t gil_safe_ptr_cast(boost::gil::bits8* pBits8) 
{ 
    return reinterpret_cast<boost::gil::gray8_ptr_t>(pBits8); 
} 
boost::gil::bits8* pBits8 = data8; 
boost::gil::gray8_ptr_t pGray8 = gil_safe_ptr_cast<boost::gil::gray8_ptr_t>(pBits8); // works 
boost::gil::bits16* pBits16 = NULL; 
boost::gil::gray8_ptr_t pGray82 = gil_safe_ptr_cast<boost::gil::gray8_ptr_t>(pBits16); // compile error as expected 
+1

यह reinterpret_cast का उपयोग करता है। "Reinterpret_cast के बिना" क्या हुआ? – Brilliand

1

bits8 से परिवर्तित करने के लिए * gray8_ptr_t के लिए, एक struct पिक्सेल बना सकते हैं और निर्माता के लिए bits8 प्रदान करते हैं:

gray8_ptr_t convert_gray8_ptr_t(bits8* src) { 
    return new struct pixel<bits8,gray_layout_t>(*src); 
} 

वापस बदलने के लिए, struct के रूपांतरण ऑपरेटर का उपयोग :

bits8* convert_bits8(gray8_ptr_t src) { 
    bits8* result = new bits8; 
    *result = (bits8) *src; 
    return result; 
} 

बेशक ये दोनों कार्य स्मृति आवंटित करते हैं और शायद कार्यों के रूप में अनावश्यक हैं (इनलाइन कोड के रूप में बेहतर)।

+0

न केवल इन आवंटित करते हैं, बल्कि वे केवल एक ही मूल्य की प्रतिलिपि बनाने जा रहे हैं। यदि आप इस 'convert_gray8_ptr_t' में प्लग करते हैं तो पिक्सेल (0,0) को छोड़कर v से कुछ भी एक्सेस कर सकते हैं संभावित रूप से पहुंच उल्लंघन का परिणाम हो सकता है, और कम से कम एक प्रारंभिक मान होगा। – totowtwo

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