2011-11-24 14 views
7

संभव डुप्लिकेट:
length of array in function argumentएक सरणी sizeof समारोह तर्क के रूप में पारित कर दिया

हाय होमवर्क कर रहा हूँ और मैं पूरी तरह से स्टंप्डया हूँ। हम मेरे शिक्षक की स्यूडोकोड के आधार पर, तो मैं कोड के इस टुकड़े लिखा एक सूची के हर आदेश पूर्णांकों की एक सरणी प्राप्त करने के लिए लगता है कि गया:

void permute(int v[], int curr,char letters[]) 
{ 
    if(curr >= sizeof(v)/sizeof(int)) 
    { 
     checkit(v,letters); 
    } 
    for(int i = curr; i < sizeof(v)/sizeof(int); i++) 
    { 
     swap(i,curr,v); 
     permute(v,curr + 1,letters); 
     swap(v[curr],v[i]); 
    }//for 
}//permu 

केवल एक चीज मैं के बारे में सुनिश्चित नहीं कर रहा हूँ है अगर sizeof(v)/sizeof(int) सही है जाने के लिए रास्ता।

+3

अपने प्रश्न केवल 'sizeof (v)/sizeof (int)' के बारे में है, तो मैं संपादन अपने प्रश्न शीर्षक सुझाव है, क्योंकि यह "क्रमपरिवर्तन के लिए प्रत्यावर्तन" से कोई संबंध नहीं है ... –

उत्तर

9

sizeof(v)/sizeof(int) जाने का रास्ता नहीं है। आपका समारोह लिए वास्तव में बराबर है:

void permute(int *v, int curr, char *letters) 
{ 
    ... 
} 

अर्थात v वास्तव में एक सरणी नहीं है, यह एक सूचक है। आप सी या सी ++ में सरणी पास नहीं कर सकते हैं।

समाधान निम्नलिखित (नहीं संपूर्ण) में से एक है:

  • एक अतिरिक्त तर्क यह है कि स्पष्ट रूप से सरणी की लंबाई का वर्णन जोड़ने
  • एक अतिरिक्त तर्क यह है कि सरणी के अंतिम तत्व पर अंक जोड़ने
  • एक उचित कंटेनर (जैसे std::vector) है, जो आप
  • टेम्पलेट समाधान है कि @sehe पता चलता है
पर size() कॉल कर सकते हैं का उपयोग करें
+0

+1 कंटेनर, भले ही होमवर्क के लिए वे कभी-कभी आपको "सही" तरीका नहीं देते हैं। – Anthony

+0

मैंने सोचा कि आप कर सकते हैं - परमिट (int n [5]) ठीक है? सरणी काफी मूल्य से पारित नहीं है। लेकिन यह एक सरणी –

+1

@ एड्रियन है: एक सरणी एक पॉइंटर के लिए क्षय हो जाती है जब इसे फ़ंक्शन पैरामीटर के रूप में उपयोग किया जाता है। –

5

अपने पालतू peeves में से एक: आप के लिए आप

template <size_t N> 
void permute(int (&v)[N], int curr,char letters[]) 
{ 
    if(curr >= N) 
    { 
     checkit(v,letters); 
    } 
    for(int i = curr; i < N; i++) 
    { 
     swap(i,curr,v); 
     permute(v,curr + 1,letters); 
     swap(v[curr],v[i]); 
    }//for 
}//permu 
+0

उस उत्तर के लिए बहुत बढ़िया धन्यवाद! –

0

ओली के जवाब के अलावा सरणी आकार निकालना सी ++ प्राप्त कर सकते हैं: सी में विशिष्ट तरीका ++ शुरुआत करने के लिए एक सूचक और करने के लिए एक सूचक पारित करने के लिए है अनुक्रम का अंत जिसे आप अनुमति देना चाहते हैं। सम्मेलन के अनुसार शुरुआत सूचक शामिल है, अंतिम सूचक विशेष है।

void permute(int *v, int *begin, int *end, char *letters) { 
    if (begin == end) { 
    checkit(v, end, letters); 
    } else { 
    ... 
    permute(v, begin + 1, end, letters); 
    ... 
    } 
} 
संबंधित मुद्दे