मैं हाल ही में सी ++ में गहराई से जा रहा हूं और मेरी बग जटिल लगती है।सी ++: यह कैसे संभव है कि डेटा पढ़ने से स्मृति प्रभावित हो सके?
मेरे पास ऑब्जेक्ट्स का वेक्टर है, प्रत्येक ऑब्जेक्ट में फ्लोट्स का वेक्टर होता है। मैंने फैसला किया कि मुझे एक और फ्लैट सरणी बनाने की ज़रूरत है जिसमें सभी वस्तुओं के सभी फ्लोट वैल्यू हों। यह उससे थोड़ा अधिक जटिल है लेकिन समस्या का सारांश यह है कि जैसे ही मैं अपनी वस्तुओं के माध्यम से फ्लोट मूल्यों को निकालने के माध्यम से लूप करता हूं, कुछ बिंदु पर वस्तुओं का मेरा वेक्टर बदल जाता है, या कुछ अजीब तरीके से दूषित हो जाता है। (मेरे पठन ऑपरेशन सभी कॉन्स फ़ंक्शन हैं)
एमपीआईआई के साथ एक और उदाहरण था। मैं बस शुरू कर रहा था इसलिए मैं सिर्फ अपनी ही मेमोरी के साथ दो अलग-अलग नोड्स पर एक ही कोड चलाने के लिए चाहता था और बिना डेटा हस्तांतरण के, सभी बहुत ही सरल। मेरे आश्चर्य के लिए मुझे सेगमेंटेशन त्रुटियां मिलीं और घंटों के ट्रैकिंग के बाद, मैंने पाया कि एक चर का एक असाइनमेंट पूर्ण रूप से पूर्ण रूप से भिन्न चर सेट कर रहा था।
तो मैं उत्सुक हूं, यह कैसे संभव है कि पढ़ना संचालन मेरे डेटा संरचनाओं को प्रभावित कर सके। इसी प्रकार एक असंभव असंबद्ध ऑपरेशन दूसरे को कैसे प्रभावित कर सकता है। मैं उन संक्षिप्त विवरणों के साथ अपनी समस्याओं के समाधान की उम्मीद नहीं कर सका लेकिन किसी भी सलाह की सराहना की जाएगी।
अद्यतन: यहां कोड का एक सेगमेंट है, मैंने मूल रूप से पोस्ट नहीं किया क्योंकि मुझे यकीन नहीं है कि पूरे सिस्टम को समझे बिना इसे कितना निकाला जा सकता है।
एक चीज जो मैंने अभी पाया वह यह था कि जब मैंने अपने फ्लैट सरणी को मान निर्दिष्ट करना बंद कर दिया और इसके बजाय बस cout'ed, seg त्रुटियां गायब हो गईं। तो शायद मैं अपनी सरणी को गलत घोषित कर रहा हूं, लेकिन अगर मैं भी था तो मुझे यकीन नहीं है कि यह ऑब्जेक्ट वेक्टर को कैसे प्रभावित करेगा।
flatFitness = new float(popSize);
अद्यतन 2:
void xlMasterSlaveGpuEA::FillFlatGenes() {
int stringLength = pop->GetGenome(0).GetLength();
for (int i=0;i<pop->GetPopSize();i++)
for (int j=0;j<stringLength;j++)
flatGenes[(i*stringLength)+j]<< pop->GetGenome(i).GetFloatGene(j);
}
float xlVectorGenome::GetFloatGene(unsigned int i) const {
return GetGene(i);
}
मेरी फ्लैट सरणी एक सदस्य समारोह
float * flatFitness;
तो जैसे निर्माता में initailsed है
मैं बस का कहना है कि करना चाहते हैं उपरोक्त दो उदाहरण संबंधित नहीं हैं, पहला वाला बहु थ्रेड नहीं है। दूसरा एमपीआई उदाहरण तकनीकी रूप से है, लेकिन एमपीआई को स्मृति वितरित किया गया है और मैंने जानबूझकर सबसे सरल कार्यान्वयन का प्रयास किया जो मैं सोच सकता था, जो दोनों मशीनें स्वतंत्र रूप से कोड चल रही हैं। लेकिन वहाँ एक अतिरिक्त विस्तार है, मैं एक condtional कह
if node 1 then do bottom half of loop
if node 1 then do top half
फिर स्मृति अलग करना चाहिए, वे काम किया जाना चाहिए के रूप में यदि वे एक दूसरे के बारे में कुछ भी नहीं पता .. लेकिन यह सशर्त को दूर करने और बनाने दोनों छोरों कर में डाल सभी क्यूब्स, त्रुटि
आप अपने कोड का एक संक्षिप्त संस्करण पोस्ट कर सकते हैं? यह हो सकता है कि यह क्या हो रहा है, यह बताने में बहुत मुश्किल है। – tgamblin
आप पाश कोड जहां वेक्टर में वस्तुओं पुनरावृति पोस्ट कर सके ... संभवतः आप स्मृति पर वहाँ कदम कर रहे हैं? – Balk
पढ़ें ऑपरेशन मूल्यों को नहीं बदलते हैं। आपके कोड में कुछ और होना चाहिए। आपका दूसरा उदाहरण गलत स्थान पर इंगित चर के एक सामान्य स्थिति है। – fbinder