2009-04-07 19 views
11

मेरे पास (void*) बफर है कि मुझे इसे पास करने से पहले std::vector<unsigned char> में कनवर्ट करने की आवश्यकता है। दुर्भाग्यवश, मेरे सी ++ कास्टिंग कौशल थोड़ा कमजोर है। कोई सुझाव?कनवर्ट करना (शून्य *) से std :: vector <unsigned char>

उत्तर

22

आपको बफर की लंबाई की आवश्यकता होगी। एक बार जब आप करते हैं, हम यह कर सकते हैं:

unsigned char *charBuf = (unsigned char*)voidBuf; 
/* create a vector by copying out the contents of charBuf */ 
std::vector<unsigned char> v(charBuf, charBuf + len); 

ठीक है, टिप्पणी मिल गया मुझे कारण है कि मैं reinterpret_cast का उपयोग नहीं किया पर शुरू:

  • सी ++ में, सी शैली डाली एक है सुविधा समारोह - यह संकलक को उपलब्ध कास्ट ऑपरेटरों के सेट पर रूपांतरण का सबसे सुरक्षित और सबसे पोर्टेबल रूप चुनने के लिए कहता है।

  • reinterpret_cast कार्यान्वयन परिभाषित किया गया है और हमेशा आपके दिमाग पर आखिरी चीज होनी चाहिए (और जब आप जरूरी रूप से गैर पोर्टेबल चीज़ कर रहे हों)।

  • के बीच रूपांतरण (unsigned प्रकार परिवर्तन नहीं करता है) char * और void * पोर्टेबल है (आप वास्तव में static_cast इस्तेमाल कर सकते हैं यदि आप वास्तव में picky रहे हैं)।

सी शैली कलाकारों के साथ समस्या है: अतिरिक्त लचीलेपन heartaches पैदा कर सकता है जब सूचक प्रकार बदल जाता है।

नोट: मैं जितना संभव हो उतना कास्टिंग नहीं करने के सामान्य सम्मेलन से सहमत हूं। हालांकि, प्रदान किए गए किसी भी स्रोत के बिना, यह सबसे अच्छा है जो मैं कर सकता था।

+0

reinterpret_cast grep के लिए आसान है। –

+0

और दोनों को –

+0

@tlholaday से बचा जाना चाहिए: static_cast <> को शून्य * में डालने के लिए उपयोग किया जा सकता है, इसलिए इसका उपयोग इसके बजाय किया जाना चाहिए। –

3

आप void* को std::vector<unsigned char> पर नहीं डाल सकते हैं क्योंकि बाद के मेमोरी लेआउट में अन्य ऑब्जेक्ट्स शामिल हैं, जैसे आकार और वर्तमान में आवंटित बाइट्स की संख्या।

बफर मान लिया जाये कि buf द्वारा की ओर इशारा किया गया है और इसकी लंबाई n है:

vector<unsigned char> vuc(static_cast<char*>(buf), static_cast<char*>(buf) + n); 

बफर कि आप सुरक्षित रूप से उपयोग कर सकते हैं की एक प्रतिलिपि पैदा करेगा।

[संपादित करें: static_cast<char*> जोड़ा गया है, जो सूचक अंकगणित के लिए आवश्यक है।]

3

आप किसी भी कास्टिंग कर नहीं किया जाना चाहिए - पूर्ण रोक। कृपया कुछ कोड पोस्ट करें जो आपके प्रश्न को दिखाता है - मैं वास्तव में समझ नहीं पा रहा हूं कि "(शून्य *) बफर" का क्या मतलब है।

+1

एक शून्य * बफर अज्ञात प्रकार के स्मृति क्षेत्र में सिर्फ एक सूचक है - सी प्रोग्राम उनमें से भरे हुए हैं। –

+1

हालांकि एक कास्ट यहां नहीं किया जा सकता है, ऐसे समय होते हैं जब कास्टिंग उपयोगी और/या लंबे समय से डिजाइन किए गए निर्णयों के कारण अपरिहार्य है। (जैसे कि मानक जनादेश जो वेक्टर आंतरिक रूप से अपने तत्वों को आंतरिक रूप से संग्रहीत करते हैं ताकि वी [0] को "पारंपरिक" बफर के रूप में माना जा सके।) –

+0

@j_random तो यह एक सुंदर बेकार बफर है, यह देखते हुए कि आप शून्य को अस्वीकार नहीं कर सकते हैं * और इस प्रकार बफर सामग्री तक पहुंच नहीं सकते –

2

पहले से आवंटित बफर के लिए std :: वेक्टर क्लास का उपयोग कर समाधान नहीं है। एक std :: वेक्टर ऑब्जेक्ट स्मृति को प्रबंधित करता है और इसे विनाश के समय पर रोक देता है।

एक जटिल समाधान अपनी खुद की संभाजक, एक पहले से ही आवंटित बफर का उपयोग करता है लिखने के लिए हो सकता है, लेकिन आप, कई परिदृश्य पर बहुत सावधान रहना होगा वेक्टर आकार बदलने की तरह, आदि

आपको लगता है कि शून्य है, तो * बफर कुछ सी एपीआई कार्यों के माध्यम से बाध्य, तो आप std :: वेक्टर में रूपांतरण के बारे में भूल सकते हैं।

आपको लगता है कि बफर का केवल एक प्रतिलिपि की जरूरत है, तो वह ऐसा किया जा सकता है:

std::vector< unsigned char> cpy( 
    (unsigned char*)buffer, (unsigned char*)buffer + bufferSize); 

जहां bufferSize की नकल की बफर के वर्ण में आकार है।

3

एकमात्र समय यह वैध होगा यदि आप पहले ही वेक्टर बना चुके हैं, और बस इसे वापस लेना चाहते हैं।

void SomeFunc(void* input); 

main() { 
    std::vector< unsigned char > v; 
    SomeFunc((void*) &v); 
} 

SomeFunc(void* input) { 
    // Now, you could cast that void* into a vector 
    std::vector< unsigned char >* v_ = (vector<unsigned char>*)input 
} 

मैंने वास्तव में यह देखने की कोशिश नहीं की है कि यह दौड़ जाएगा या नहीं, लेकिन यह इसकी भावना है। उस ने कहा, अगर आप इसे खरोंच से बना रहे हैं, तो आप निश्चित रूप से गलत कर रहे हैं। यह वास्तव में बुरा है। एकमात्र समय यह दूरस्थ रूप से समझा जा सकता है कि अगर आपको पहले से परिभाषित "SomeFunc()" को लागू करने के लिए मजबूर किया गया है।

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