2010-08-27 16 views
9

बहुआयामी सरणी तत्वों भरें मैं एक 2d है और मैं सभी तत्वोंसाथ 0 के

int a[100][200]; 

मैं उन्हें घोषणा के बिंदु पर प्रारंभ नहीं कर सकते हैं पाशन के बिना शून्य करने के लिए तत्वों सेट करना चाहते हैं।

+3

घोषणा के समय आप उन्हें क्यों शुरू नहीं कर सकते? –

+0

क्या आप उन्हें कक्षा में घोषित करने की कोशिश कर रहे हैं? – cpx

उत्तर

2

memset(a, 0, 100 * 200 * sizeof(int)); यह करना चाहिए।

13

memset(a,0,sizeof(a));

यह केवल 0 बाइट्स के साथ सरणी द्वारा प्रयुक्त स्मृति अधिलेखित कर देता है की कोशिश करो। उपयोगकर्ता द्वारा परिभाषित डेटा प्रकारों के लिए ऐसा न करें जबतक कि आप वास्तव में नहीं जानते कि आप क्या करते हैं। std::fill और std::fill_n भी है, जो अधिक C++ ish है (लेकिन यहां सबसे आसान तरीका नहीं है)।

+2

गैर-उपयोगकर्ता परिभाषित डेटा-प्रकारों के लिए भी, यह अप्रत्याशित परिणाम उत्पन्न कर सकता है। डेटा सदस्य-पॉइंटर्स एक उदाहरण हैं जो सी ++ में गैर-0x0 नल-पॉइंटर एन्कोडिंग का उपयोग करते हैं - एबीआई जीसीसी और क्लैंग ("इटेनियम एबीआई") द्वारा उपयोग किया जाता है - वे सभी -1 बिट्स का उपयोग करते हैं। "Int" के लिए यह ठीक होना चाहिए हालांकि। –

+0

क्या आप 'sizeof (a) * sizeof (int)' का उपयोग नहीं करना चाहिए? – Mikhail

+2

नहीं, सरणी पर आकार बाइट्स में सही आकार देता है, इसलिए int आकार से गुणा करने की कोई आवश्यकता नहीं है। –

1

इस सरणी फ़ाइल गुंजाइश पर घोषित कर दिया जाता है, तो या समारोह दायरे में लेकिन 'स्थिर' के साथ है, तो यह स्वचालित रूप से शून्य करने के लिए आरंभ नहीं हो जाता आप के लिए, आप कुछ भी करने को नहीं है। कार्यक्रम स्टार्टअप पर यह केवल एक प्रारंभिकता के लिए अच्छा है; अगर आपको इसे रीसेट करने की ज़रूरत है तो आपको स्वयं को कोड करना होगा। मैं इसके लिए memset का उपयोग करूंगा।

यह स्थिर बिना समारोह गुंजाइश पर घोषित कर दिया है, तो आप memset उपयोग करने की आवश्यकता है, या एक स्पष्ट प्रारंभकर्ता - एक ही = { 0 } पर्याप्त है, आप सभी 200 शून्यों को लिखने के लिए की तरह किसी और सुझाव की जरूरत नहीं है।

+0

यह भी जोड़ना चाहिए कि गैर स्थैतिक घोषणा के साथ स्थिर चर बनाम चर के अर्थशास्त्र बहुत अलग हैं। चर के रूप में घोषित वैरिएबल मूल रूप से एक राज्य घोषित; ओपी चाहता है कि यह हो सकता है। मैं मेमसेट दृष्टिकोण (या स्पष्ट प्रारंभकर्ता) से सहमत हूं। – Schedler

23

प्रयास करें

int a[100][200] = {{0}}; 

आप कुछ (लेकिन सभी नहीं) तत्वों के प्रारंभ करते हैं, तो बाकी शून्य करने के लिए प्रारंभ की जाएगी। यहां, आप केवल पहले उप-सरणी के पहले तत्व को स्पष्ट रूप से प्रारंभ कर रहे हैं और संकलक बाकी की देखभाल कर रहा है।

+1

+1 '= {0} 'भी काम करना चाहिए, लेकिन यह संभवत: कंपाइलर चेतावनियों से बेहतर होगा। – Potatoswatter

+12

और इसे कम करने के लिए भी छोटा, सी ++ '= {};' की अनुमति देता है। –

1

वास्तव में क्या करता है "मैं उन्हें घोषणा के बिंदु पर प्रारंभ नहीं कर सकता है" क्या मतलब है? "पता नहीं कैसे"? या "वहां कोड को संशोधित नहीं कर सकता"?

C++ भाषा एक विशेषता यह है कि घोषणा के बिंदु

int a[100][100] = {}; 

पर 0 करने के लिए पूरे सरणी initializes है (ध्यान दें, कोई स्पष्ट 0 वास्तव में {} के बीच आवश्यक है)। क्या आप इसका इस्तेमाल कर सकते हैं या नहीं?

तो आप कर सकते हैं नहीं है, तो अपने विकल्प हैं: का उपयोग memset -hack, 1 डी-पुनर्व्याख्या-हैक या (के साथ या std::fill के लिए मदद के बिना) सरणी (रों) के माध्यम से पुनरावृत्ति द्वारा स्पष्ट रूप से प्रत्येक तत्व निर्धारित किया है।

+0

घोषणा में प्रारंभ प्रतिबंधित है, उदाहरण के लिए, जब 'गोटो' या 'स्विच' वैरिएबल के दायरे में घोषणा पर कूदता है। – Potatoswatter

0

memset दृष्टिकोण का उल्लेख (memset(a,0,sizeof(a));) काम करेंगे, लेकिन क्या बारे में (जो आपके टैग प्रति) यह सी ++ तरीका कर रही है, और वेक्टर का उपयोग कर?

std::vector<std::vector<int> > a; 
a.assign(100, std::vector<int>(200)); 
3

सी ++ बहु-आयामी सरणी को बेस-एलिमेंट पॉइंटर द्वारा पूरी तरह से पुनरावृत्त करने की अनुमति देता है। तो तुम std::fill उपयोग कर सकते हैं और यह बहुत पहले nonarray तत्व

std::fill(a[0] + 0, a[99] + 100, 0); 

पारित सी में इस औपचारिक रूप से अनुमति नहीं है, और आप प्रत्येक अलग subarray के माध्यम से पुनरावृति करने की आवश्यकता होगी पहली subarray के परे पुनरावृत्ति क्योंकि अतीत- सूचकांक सी में अपरिभाषित व्यवहार का कारण बनता हैफिर भी, अभ्यास में यह अभी भी काम करता है।

+0

क्या यह अभी भी सच है? (क्या यह कभी था?) – Potatoswatter

0

मैंने इस समाधान का परीक्षण किया और यह काम किया।

int arr[100][200]; 

for (int i=0; i<100; i++) 
    for (int j=0; j<200; j++) (arr[i][j] = 0); 

for (int i=0; i<100; i++) 
    for (int j=0; j<200; j++) cout << (arr[i][j]); 
2

सी ++ के लिए, आप एल्गोरिदम हेडर से std: fill विधि का उपयोग कर सकते हैं।

int a[x][y]; 
std::fill(a[0], a[0] + x * y, 0); 

तो, आपके मामले में आप इस इस्तेमाल कर सकते हैं:

int a[100][200]; 
std::fill(a[0], a[0] + 100 * 200, 0); 
बेशक

, 0 किसी भी पूर्णांक मूल्य के लिए बदला जा सकता है।

0

कई उत्तर fill के साथ पॉइंटर अंकगणित का उपयोग करते हैं। यह सरल किया जा सकता है:

int a[N][K]; 
fill(a[0], a[N], 0); 

असल में, a[N] बहु-आयामी सरणी के बाद पहली बार एक स्मृति पता है, कोई बात नहीं देखते हैं कितने आयाम। यह भी काम करता है:

int a[N][K][L][M]; 
fill(**a[0], **a[N], 0); 

यहां तारक int* प्रकार (सरणी कोष्ठक int*** को int**** dereferences, दो तारक काम के बाकी करता है) करने के लिए नीचे संकेत dereferences।

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