2009-06-09 34 views
27

पर पारित होने पर सरणी का आकार निर्धारित करता है यदि यह किसी अन्य फ़ंक्शन (आकार पास नहीं हुआ है) को सरणी के आकार को निर्धारित करना संभव है? सरणी को int सरणी [] = {XXX} की तरह शुरू किया गया है ..फ़ंक्शन

मैं समझता हूं कि यह आकार नहीं करना संभव है क्योंकि यह सूचक के आकार को वापस कर देगा .. कारण मैं पूछता हूं क्योंकि मुझे एक चलाने की आवश्यकता है अन्य फ़ंक्शन के अंदर लूप जहां सरणी पास हो जाती है। मैं कुछ ऐसा करने की कोशिश की:

for(int i = 0; array[i] != NULL; i++) { 
........ 
} 

लेकिन .. मैंने देखा है कि सरणी के पास अंत में, सरणी [i] कभी कभी कचरा मूल्यों 758,433 की तरह होते हैं जो सरणी के प्रारंभ में निर्दिष्ट एक मूल्य नहीं है

उत्तर

41

अन्य उत्तरों सी ++ की एक विशेषता को अनदेखा करते हैं। सरणियों, नहीं संकेत के लिए

int x[10]; 
func(x); 

लेकिन ध्यान दें, यह केवल काम करता है: आप संदर्भ द्वारा सरणियों पारित कर सकते हैं, और प्रयोग टेम्पलेट्स:

template <typename T, int N> 
void func(T (&a) [N]) { 
    for (int i = 0; i < N; ++i) a[i] = T(); // reset all elements 
} 

तो आप ऐसा कर सकते हैं।

हालांकि, जैसा कि अन्य उत्तरों ने ध्यान दिया है, std::vector का उपयोग करना बेहतर विकल्प है।

+6

+1 यह कुछ हद तक एक समाधान है, लेकिन प्रत्येक अलग सरणी आकार के लिए एक अलग func() प्रतीक बना देगा। यही है, अलग-अलग स्थानों में पास किए गए सरणी के अलग-अलग आकार होते हैं, फ़ंक्शन को कई बार तुरंत चालू किया जाएगा। यह उपयोगी हो सकता है हालांकि किसी अन्य फ़ंक्शन में किसी कॉल में सरणी के आकार को सम्मिलित करने के लिए जिसमें वास्तविक कार्यान्वयन होता है और आकार प्राप्त होता है, शायद इसे इनलाइन के रूप में फ़्लैग किया जाता है (नहीं कि संकलक को आपके नियम का पालन करना चाहिए ...) टेम्पलेट इनलाइन शून्य रैपर (टी (और ए) [एन]) {वापसी func (ए, एन); } - func() असली समारोह होने के साथ। –

+0

निश्चित रूप से, लक्ष्य उस कार्य को बनाना होगा जो उस पर चल रहा है इतना छोटा है कि इसे रेखांकित करने की संभावना है। मुझे आपके रैपर विचार भी पसंद हैं। –

8

नहीं, यह संभव नहीं है।

एक वर्कअराउंड: सरणी के अंतिम मूल्य पर एक विशेष मान रखें ताकि आप इसे पहचान सकें।

+10

... और जब कोई व्यक्ति उस विशेष मान को सरणी के बीच में रखता है तो मामलों को डीबग करने के लिए तैयार हो जाता है। दूसरे शब्दों में: ऐसा मत करो। दूसरों की तरह कहा: सूखे परिभाषित कंटेनर (जैसे एसटीएल) का उपयोग करें या इसके साथ सरणी के आकार को पास करें – Rom

+0

फ़ंक्शन के अन्य पैरामीटर के रूप में सरणी के अंत में विशेष मानों का उपयोग करने के लिए केवल एक उपयोगी कारण है: चर लंबाई कार्यों में पैरामीटर। लेकिन इस मामले में भी इनपुट सरणी के आकार को निर्दिष्ट करने के लिए निर्दिष्ट। – zabulus

+0

यदि कोई सरणी के अंदर की लंबाई को सहेजने पर विचार करता है, तो मैं सरणी के सामने इस विशेष मान (सरणी की लंबाई) पास कर दूंगा और मैं सूचक को बढ़ा दूंगा ताकि सूचक [-1] हमेशा यह लंबाई मान हो। जहां तक ​​मुझे पता है (SysAllocString देखें) इस अवधारणा को माइक्रोसॉफ्ट विंडोज बीस्ट्रेट द्वारा आंतरिक रूप से उपयोग किया जाता है। यदि तारों की सरणी के साथ काम करना है, तो एक और संभावित समाधान है। सरणी के अंत में सरणी के अंत में डबल न्यूल चरित्र के साथ निर्धारित किया जाता है। – bkausbk

3

आप आकार पारित नहीं हो सकता, तो आप एक अलग पहचाना प्रहरी अंत में (मूल्य की जरूरत है और आप इसे वहाँ अपने आप को डाल करने के लिए की जरूरत है - के रूप में आप मिल गया है, तो आप सी भरोसा नहीं कर सकते ++ करने के लिए यह आपके लिए स्वचालित रूप से!)। बुलाए जाने वाले फ़ंक्शन को जादुई रूप से दैवीय आकार का कोई तरीका नहीं है, अगर यह पारित नहीं हुआ है और उपयोग में कोई स्पष्ट, भरोसेमंद सेंटीनेल नहीं है।

1

क्या आप सरणी में \0 एक शून्य वर्ण जोड़कर कोशिश कर सकते हैं और फिर इसे भेज सकते हैं? इस तरह, आप लूप में बस \ 0 की जांच कर सकते हैं।

12

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

+1

सहमत हुए। यदि आप वेक्टर के बारे में नहीं जानते हैं, तो अब सीखने का एक अच्छा समय है! यह आपके जीवन को अधिक आसान बना देगा। – rlbond

6

एक स्पष्ट समाधान एसटीएल का उपयोग करना है। यदि यह संभावना नहीं है, तो स्पष्ट रूप से सरणी लंबाई को पार करना बेहतर है। इस विशेष मामले के लिए, मुझे सेंटीनेल मूल्य चाल का उपयोग करने के बारे में संदेह है। यह पॉइंटर्स के सरणी के साथ बेहतर काम करता है, क्योंकि न्यूल एक सेंटीनेल के लिए एक अच्छा मूल्य है। पूर्णांक की सरणी के साथ, यह इतना आसान नहीं है - आपको "जादू" सेंटीनेल मान होना चाहिए, जो अच्छा नहीं है।

साइड नोट: अपने सरणी परिभाषित और initalized है, तो के रूप में

int array[] = { X, Y, Z }; 
अपने पाश के रूप में ही दायरे में

, तो

sizeof (सरणी) वापस आ जाएगी यह बाइट में वास्तविक आकार है, है ना आकार सूचक का।आप सरणी लंबाई

sizeof(array)/sizeof(array[0]) 

हालांकि, सामान्य स्थिति में, यदि आप सूचक के रूप में सरणी प्राप्त करते हैं, तो आप इस चाल का उपयोग नहीं कर सकते हैं।

3

आप अपनी int सरणी में टर्मिनेटर जोड़ सकते हैं और विधि के भीतर आकार को खोजने के लिए मैन्युअल रूप से सरणी के माध्यम से कदम उठा सकते हैं।

#include<iostream> 
using namespace std; 

int howBigIsBareArray(int arr[]){ 
    int counter = 0; 
    while (arr[counter] != NULL){ 
     counter++; 
    } 
    return counter; 
} 
int main(){ 
    int a1[6] = {1,2,3,4,5,'\0'}; 
    cout << "SizeOfMyArray: " << howBigIsBareArray(a1); 
} 

इस कार्यक्रम के प्रिंट:

SizeOfMyArray: 5 

यह एक हे (एन) समय जटिलता आपरेशन जो बुरा है। अपने आकार को खोजने के लिए आपको किसी सरणी के माध्यम से कभी भी कदम नहीं उठाना चाहिए।

+0

मैं @Eric Leschinski से सहमत हूं, लेकिन अब हर दिन कोडिंग प्रतियोगिता आपको इस तरीके से फ़ंक्शन प्रोटोटाइप लिखने के लिए कहती है। चूंकि जावा जैसी अन्य भाषाएं, सी # के आकार को खोजने का एक तरीका है। मुझे लगता है कि अली का जवाब सही है। उदाहरण के लिए, http://codeyourwayin.topcoder.com/arena उन्होंने अलग-अलग भाषाओं के लिए प्रोटोटाइप का उल्लेख किया। – siddhusingh

+0

आपको केवल यह सुनिश्चित करना होगा कि सरणी में कोई शून्य नहीं है क्योंकि टर्मिनेटर शून्यकरण के लिए शून्य – Nav

+0

-1 के समान मूल्यांकन करता है: "आपको इसके आकार को खोजने के लिए कभी भी सरणी के माध्यम से कदम नहीं उठाया जाना चाहिए।" कभी नहीँ? आपको लगता है कि स्ट्रेलन कैसे काम करता है? – Spike0xff

0

असल

के लिए

की सूची Chucks (; सरणी [i] = शून्य;! Int i = 0 i ++) { ........ }

एक sizeof से पहले प्रत्येक कॉल अपमानजनक है और आपको यह जानने के लिए जरूरी है कि आपको क्या मिलता है।

यदि आप सरणी के अंत में एक नल डालते हैं तो बढ़िया काम करता है।

क्यों ?? प्रत्येक दिनचर्या में आकार देने वाले एम्बेडेड डिज़ाइनों के साथ प्रत्येक सरणी के साथ एक पूर्ण की तुलना में प्रत्येक कॉल बहुत बड़ी होती है। मेरे पास 2K PIC16F684 चिप है और इसमें सर के साथ पास किए गए आकार का उपयोग करके 12 कॉल के साथ चिप का 10 प्रतिशत तक का समय लगता है। नल के साथ केवल सरणी और चक्स कोड के साथ प्रत्येक सरणी ... मुझे 4 प्रतिशत की आवश्यकता है।

बिंदु में एक सही मामला .. धन्यवाद चक अच्छी कॉल।

+0

आकार से स्वयं न तो समय और न ही स्थान बर्बाद करता है, इसका संकलन समय पर मूल्यांकन किया जाता है। इसे एक अतिरिक्त पैरामीटर के रूप में पास करने से फ़ंक्शन कॉल एक या दो निर्देशों से बड़ा हो जाता है, जो हां, जब आपके पास केवल 2K स्मृति है तो कोई फर्क नहीं पड़ता। आप महसूस करते हैं कि ... अटूट है? – Spike0xff