मैं एक सामान्य फ़ंक्शन लिखने की कोशिश कर रहा हूं जो विभिन्न डेटा प्रकारों के तर्कों को vector<char> में रखता है और संग्रहीत करता है। कास्टिंग से मेरा मतलब है कि पात्रों के वेक्टर के भीतर बिट प्रतिनिधित्व संरक्षित है। उदाहरण के लिए एक 4 बाइट int जैसे 0x19a4f607 को वेक्टर में vc[0] = 0x19, vc[1] = 0xa4, vc[2] = 0xf6 और vc[3] = 0x07 के रूप में स्टोर किया जाएगा।

मैंने अब तक जो लिखा है वह यहां है, लेकिन मुझे सेगमेंटेशन गलती मिलती है। कुछ अनुमान है इसे कैसे ठीक किया जा सकता है?

template <class T>
void push_T(vector<char>& vc, T n){
  char* cp = (char*)&n;
  copy(cp, cp+sizeof(T), vc.end());
}
0
Pirooz 3 अगस्त 2011, 06:17
1
सब कुछ डालने के बाद आप वेक्टर की सामग्री को समझने की योजना कैसे बना रहे हैं? क्या आप कुछ क्रमबद्ध करने की कोशिश कर रहे हैं?
 – 
Karl Knechtel
3 अगस्त 2011, 06:19
सही बात है। मुझे पता है कि मैं किस क्रम में और किस डेटा को एन्कोडिंग कर रहा हूं, इसलिए, मुझे अपने डेटा को डीकोड करने के बारे में चिंता करने की ज़रूरत नहीं है।
 – 
Pirooz
3 अगस्त 2011, 06:21
मैं पता हेरफेर के साथ उपयोग करने के लिए चार के बजाय अहस्ताक्षरित चार का उपयोग करने का सुझाव दूंगा; जहां हस्ताक्षरित डेटा का कोई महत्व नहीं है।
 – 
sarat
3 अगस्त 2011, 10:35

2 जवाब

सबसे बढ़िया उत्तर

आपको एक पुनरावर्तक की आवश्यकता है जो वेक्टर के अंत में डालने में सक्षम हो; .begin() और .end() केवल मौजूदा तत्वों को संशोधित करने में सक्षम हैं। std::back_inserter(vc) आजमाएं।

1
Karl Knechtel 3 अगस्त 2011, 06:21

यहां तत्काल समस्या यह है कि आपने अपने वेक्टर का आकार बदलने का कोई प्रयास नहीं किया है, इसलिए आप तुरंत अंतर्निहित सरणी के अंत को लिख देते हैं। आपको copy() कॉल से पहले vc.resize(vc.size() + sizeof(T)), या एक std::back_inserter इंसर्ट इटरेटर का उपयोग करना होगा ताकि कॉपी पर push_back() व्यवहार को लागू किया जा सके।

अब, मैं मान लूंगा कि आपके पास टाइप सिस्टम को पहली बार में बदलने का एक अच्छा कारण है ....

1
Drew Hall 3 अगस्त 2011, 06:26