मेरे पास (void*)
बफर है कि मुझे इसे पास करने से पहले std::vector<unsigned char>
में कनवर्ट करने की आवश्यकता है। दुर्भाग्यवश, मेरे सी ++ कास्टिंग कौशल थोड़ा कमजोर है। कोई सुझाव?कनवर्ट करना (शून्य *) से std :: vector <unsigned char>
उत्तर
आपको बफर की लंबाई की आवश्यकता होगी। एक बार जब आप करते हैं, हम यह कर सकते हैं:
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 पैदा कर सकता है जब सूचक प्रकार बदल जाता है।
नोट: मैं जितना संभव हो उतना कास्टिंग नहीं करने के सामान्य सम्मेलन से सहमत हूं। हालांकि, प्रदान किए गए किसी भी स्रोत के बिना, यह सबसे अच्छा है जो मैं कर सकता था।
आप void*
को std::vector<unsigned char>
पर नहीं डाल सकते हैं क्योंकि बाद के मेमोरी लेआउट में अन्य ऑब्जेक्ट्स शामिल हैं, जैसे आकार और वर्तमान में आवंटित बाइट्स की संख्या।
बफर मान लिया जाये कि buf
द्वारा की ओर इशारा किया गया है और इसकी लंबाई n
है:
vector<unsigned char> vuc(static_cast<char*>(buf), static_cast<char*>(buf) + n);
बफर कि आप सुरक्षित रूप से उपयोग कर सकते हैं की एक प्रतिलिपि पैदा करेगा।
[संपादित करें: static_cast<char*>
जोड़ा गया है, जो सूचक अंकगणित के लिए आवश्यक है।]
आप किसी भी कास्टिंग कर नहीं किया जाना चाहिए - पूर्ण रोक। कृपया कुछ कोड पोस्ट करें जो आपके प्रश्न को दिखाता है - मैं वास्तव में समझ नहीं पा रहा हूं कि "(शून्य *) बफर" का क्या मतलब है।
एक शून्य * बफर अज्ञात प्रकार के स्मृति क्षेत्र में सिर्फ एक सूचक है - सी प्रोग्राम उनमें से भरे हुए हैं। –
हालांकि एक कास्ट यहां नहीं किया जा सकता है, ऐसे समय होते हैं जब कास्टिंग उपयोगी और/या लंबे समय से डिजाइन किए गए निर्णयों के कारण अपरिहार्य है। (जैसे कि मानक जनादेश जो वेक्टर
@j_random तो यह एक सुंदर बेकार बफर है, यह देखते हुए कि आप शून्य को अस्वीकार नहीं कर सकते हैं * और इस प्रकार बफर सामग्री तक पहुंच नहीं सकते –
पहले से आवंटित बफर के लिए std :: वेक्टर क्लास का उपयोग कर समाधान नहीं है। एक std :: वेक्टर ऑब्जेक्ट स्मृति को प्रबंधित करता है और इसे विनाश के समय पर रोक देता है।
एक जटिल समाधान अपनी खुद की संभाजक, एक पहले से ही आवंटित बफर का उपयोग करता है लिखने के लिए हो सकता है, लेकिन आप, कई परिदृश्य पर बहुत सावधान रहना होगा वेक्टर आकार बदलने की तरह, आदि
आपको लगता है कि शून्य है, तो * बफर कुछ सी एपीआई कार्यों के माध्यम से बाध्य, तो आप std :: वेक्टर में रूपांतरण के बारे में भूल सकते हैं।
आपको लगता है कि बफर का केवल एक प्रतिलिपि की जरूरत है, तो वह ऐसा किया जा सकता है:
std::vector< unsigned char> cpy(
(unsigned char*)buffer, (unsigned char*)buffer + bufferSize);
जहां bufferSize की नकल की बफर के वर्ण में आकार है।
एकमात्र समय यह वैध होगा यदि आप पहले ही वेक्टर बना चुके हैं, और बस इसे वापस लेना चाहते हैं।
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()" को लागू करने के लिए मजबूर किया गया है।
- 1. सुविधाजनक स्ट्रीम std :: vector <unsigned char> इनपुट स्ट्रीम (std :: istream) ऑब्जेक्ट
- 2. std :: vector <int> से 0
- 3. मैं std :: atomic <unsigned int>
- 4. std :: vector से दूसरे
- 5. std :: string को std :: vector <char>
- 6. std :: vector <unsigned int> की शुरुआत निरंतर हस्ताक्षरित पूर्णांक की सूची के साथ
- 7. स्ट्रिंग द्वारा std :: vector <std :: pair <std :: string, bool >> को सॉर्ट करना?
- 8. std :: vector
- 9. std :: vector
- 10. std :: vector
- 11. सीवी :: मैट से std :: vector
- 12. std :: vector को सरणी
- 13. `std :: vector <uchar>` `std :: ostream` में कैसे सहेजें?
- 14. एक शून्य :: वेक्टर <std :: string>
- 15. क्या std :: vector :: clear() std :: vector :: क्षमता() को शून्य पर कॉल करेगा?
- 16. std :: vector और std :: list
- 17. सी ++: std :: vector
- 18. एक std :: vector
- 19. std :: vector :: ऑपरेटर [] std :: vector :: at() से 5 से 10 गुना तेज क्यों है?
- 20. एक std :: vector को std :: valarray
- 21. `std :: vector <primitive> :: स्पष्ट()` निरंतर समय ऑपरेशन है?
- 22. वेक्टर चार * वेक्टर <unsigned char> Initalisation
- 23. कनवर्ट करना <> ऑपरेटर से python3
- 24. 'void *' से 'unsigned char *'
- 25. सी # में देशी सी ++ कोड का उपयोग करना - std :: vector
- 26. std :: वेक्टर <std::string> क्रैश
- 27. बनाना std :: vector गठबंधन स्मृति आवंटित
- 28. std :: vector :: clear() कन्स्ट्रक्टर और विनाशक में
- 29. क्या std :: vector अपना पता बदलता है?
- 30. एक std :: vector बनाम सादे सरणी
reinterpret_cast grep के लिए आसान है। –
और दोनों को –
@tlholaday से बचा जाना चाहिए: static_cast <> को शून्य * में डालने के लिए उपयोग किया जा सकता है, इसलिए इसका उपयोग इसके बजाय किया जाना चाहिए। –