2009-10-20 13 views
24

मेरे पास मेरे प्रोग्राम में कहीं भी बनाए गए structs की एक सरणी है।एक सी सरणी के माध्यम से Iterate

बाद में, मैं इसके माध्यम से पुन: प्रयास करना चाहता हूं, लेकिन मेरे पास सरणी का आकार नहीं है।

मैं तत्वों के माध्यम से कैसे पुन: प्रयास कर सकता हूं? या मुझे कहीं आकार को स्टोर करने की ज़रूरत है?

उत्तर

18

आप कहीं आकार को स्टोर कर सकते हैं, या आपके पास एक विशेष मूल्य सेट के साथ एक संरचना हो सकती है जिसे आप सेंटीनेल के रूप में उपयोग करते हैं, वैसे ही '\ 0' स्ट्रिंग के अंत को इंगित करता है।

+4

+1 मैं आमतौर पर structs की ओर इशारा उपयोग करती हैं इसलिए कि मुझे यकीन है कि 'NULL' एक अनूठा प्रहरी है हो सकता है। –

+5

मुझे लगता है कि अशक्त-समाप्त-स्ट्रिंग मॉडल का अनुसरण एक बुरा विचार – hasen

+0

@hasen j है: मैं मानता हूँ, जब तक आप जानते हैं कि आप हमेशा पूरे सरणी हर बार, ऐसी स्थिति में एक प्रहरी थोड़ा कोड स्पष्ट कर सकते हैं के माध्यम से पुनरावृति करना है। सेंटीनेल के साथ समस्या यह है कि आप ओ (एन) व्यवहार के साथ समाप्त हो सकते हैं जहां ओ (1) होता, और हमेशा इसका एहसास नहीं होता। – quark

39

यदि सरणी का आकार संकलन समय पर जाना जाता है, तो आप तत्वों की संख्या निर्धारित करने के लिए संरचना आकार का उपयोग कर सकते हैं।

struct foo fooarr[10]; 

for(i = 0; i < sizeof(fooarr)/sizeof(struct foo); i++) 
{ 
    do_something(fooarr[i].data); 
} 

यह संकलन समय पर नहीं जाना जाता है, तो आप एक आकार कहीं स्टोर या सरणी के अंत में एक विशेष टर्मिनेटर मूल्य बनाने की आवश्यकता होगी।

+3

एघ आप तेजी से थे !! मैं अपने जबाब संपादन किया गया था lol :) – AntonioMO

+1

दरअसल, लेकिन मैं नहीं बल्कि 'sizeof (fooarr [0])' या 'sizeof (* fooarr)' 'sizeof से (struct foo) का उपयोग करेंगे' – gatopeich

9

यह निर्भर करता है। यदि यह एक गतिशील रूप से आवंटित सरणी है, यानी, आपने इसे मॉलोक को कॉल किया है, तो अन्य लोगों का सुझाव है कि आपको या तो कहीं भी सरणी/तत्वों की संख्या को सहेजना होगा या एक सेंटीनेल (एक विशेष मूल्य वाला एक स्ट्रक्चर, जो होगा आखरी)।

यदि यह एक स्थिर सरणी है, तो आप इसे आकार/एक तत्व के आकार है sizeof कर सकते हैं।

int array[10], array_size; 
... 
array_size = sizeof(array)/sizeof(int); 

ध्यान दें कि, जब तक यह वैश्विक है, दायरे में यह केवल काम करता है जहां क्योंकि अगर आप इसे पिछले एक और कार्य करने के लिए सरणी प्रारंभ, यह एक सूचक को सड़ा हुआ हो जाता है: उदाहरण के लिए।

उम्मीद है कि यह मदद करता है।

+1

यह है कि क्या सरणी के बारे में नहीं है गतिशील रूप से आवंटित या नहीं है। यह wheteher के बारे में है आप सरणी प्रकार को सूचक प्रकार के लिए क्षय करने की अनुमति दी। उदाहरण के लिए, मैं इस 'int (* ए) [10] = malloc (sizeof * a)' जैसे एक गतिशील आवंटित सरणी बना सकता हूं और बाद में तत्वों की संख्या निर्धारित करने के लिए 'sizeof * a/sizeof ** a' का उपयोग कर सकता हूं । आकार को अलग से स्टोर करने की आवश्यकता नहीं है। – AnT

+7

+1, हालांकि यह 'sizeof (सरणी)/sizeof (सरणी [0]) करने के लिए थोड़ा बेहतर है, हालांकि अंतर्निहित सरणी प्रकार में परिवर्तन होने पर यह अभी भी काम करता है; यह फ़ॉर्म आपको मैक्रो को आसानी से परिभाषित करने की अनुमति देता है, उदा। '# परिभाषित करें ARRAY_COUNT (ए) (आकार (ए)/(आकार (एक [0]))'। –

+0

एक समारोह में इसे पास करने के बारे में भी यही सच है। यह सब इस बात पर निर्भर करता है कि आप इसे कैसे पास करते हैं। – AnT

0

मुझे लगता है कि आपको कहीं आकार को स्टोर करना चाहिए।

सरणी लंबाई निर्धारित करने के लिए नल-टर्मिनेटेड-स्ट्रिंग प्रकार का मॉडल एक बुरा विचार है। उदाहरण के लिए, सरणी का आकार प्राप्त करना ओ (एन) होगा जब यह ओ (1) अन्यथा बहुत आसानी से हो सकता है।

कि बीत रहा है ने कहा, एक अच्छा समाधान glib's Arrays हो सकता है, वे स्वतः ही विस्तार हो रहा है, तो आप और अधिक आइटम जोड़ने की जरूरत का अतिरिक्त लाभ है।

पीएस पूरी तरह ईमानदार होने के लिए, मैंने बहुत अधिक ग्लिब का उपयोग नहीं किया है, लेकिन मुझे लगता है कि यह एक (बहुत) प्रतिष्ठित पुस्तकालय है।

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