2010-11-02 15 views
9

मुझे सी ++ में 1 डी सरणी के साथ एक छोटी सी समस्या है। मैं एक समारोह लाइन इस मिल गया है:सी ++ सरणी के गतिशील आकार

void func(int (&array)[???]) 
{ 
    // some math here; 

    "for" loop { 
     array[i] = something; 
    } 
} 

मैं कोड में कहीं कार्यों कहते हैं, और मैं सरणी के आयाम पता करने में सक्षम नहीं कर रहा हूँ इससे पहले कि मैं गणित बनाया है। सरणी फ़ंक्शन पर संदर्भ के रूप में जाती है !, क्योंकि मुझे इसे मुख्य() फ़ंक्शन में चाहिए। मैं इस तरह सरणी आवंटित कैसे कर सकता हूं ?, तो सरणी के साथ ?? आयाम फ़ंक्शन पर संदर्भ के रूप में जाता है तो मुझे आयाम रखना होगा और इसे कुछ मान लिखना होगा।

+5

वास्तव में आपका प्रश्न थोड़ा अस्पष्ट है। क्या आपकी समस्या आवंटन, पहुंच या किसी फ़ंक्शन में सरणी को पास करने का तरीका है?कृपया कुछ वास्तविक कोड दिखाएं जो आपकी समस्या का वर्णन करता है, या वर्णन करें कि आप वास्तव में क्या करना चाहते हैं। –

+0

संदर्भों की एक सरणी एक असामान्य जानवर है: शायद आप किसी भी तरह के संदर्भों का उपयोग नहीं करना चाहते हैं। –

+0

@Eamon: आपके पास संदर्भों की एक सरणी नहीं हो सकती है, उपरोक्त कोड एक सरणी का संदर्भ है। –

उत्तर

9

एक सूचक का उपयोग करें, नहीं एक संदर्भ:

void func(int *a, int N); 

या, आसान, एक सदिश का उपयोग करें:

void func(std::vector<int> &a); 

वाहक बस

std::vector<int> a(10); 

संख्या कह कर आवंटित किया जा सकता है a.size() का उपयोग करके तत्वों को पुनर्प्राप्त किया जा सकता है।

+0

यह है :) आपको बहुत धन्यवाद, शुभकामनाएँ! – nykon

14

चूंकि आप सी ++ का उपयोग कर रहे हैं, तो इसके बजाय std::vector<> का उपयोग क्यों न करें?

+1

+1: 'std :: vector' के लिए। – rubenvb

+0

वेक्टर के लिए अतिरिक्त +1, मैं उन्हें हर समय उपयोग करता हूं जब भी मैं नहीं जानता कि "कुछ" कितना बड़ा होगा। –

+0

क्या आपको लगता है कि उत्तर शुरुआती के लिए कोई सहायक है? –

10

अन्य ने उल्लेख किया है कि आपको C++ में std::vector का उपयोग करना चाहिए और वे सही हैं।

लेकिन आप func फ़ंक्शन टेम्पलेट बनाकर अपना कोड काम कर सकते हैं।

template <typename T, size_t N> 
void func(T (&array)[N]) 
{ 
    // some math here; 

    "for" loop { 
     array[i] = something; 
    } 
} 
+0

टेम्पलेट फ़ंक्शन का तरीका एक प्रमुख उदाहरण है: "मानक लाइब्रेरी में पहले से मौजूद कार्यक्षमता को कैसे कार्यान्वित करें" ... – rubenvb

+6

@ रूबेनव: आपको क्या लगता है कि "कार्यान्वित" किया जा रहा है? –

+5

मैं इनसे सहमत हूं "आपको एक वेक्टर का उपयोग करना चाहिए"; ठीक; लेकिन यह उत्तर ओपी के मुख्य प्रश्न को हल करने और समझने का एक तरीका प्रदान करता है ... –

5

सरणी आप func के पास एक ढेर सरणी, और नहीं एक सूचक है, तो आप एक समारोह टेम्पलेट का उपयोग करके अपने आकार को बनाए रखने कर सकते हैं:

template <class T, size_t N> 
void func(T(&array)[N]) 
{ 
    size_t array_length = N; // or just use N directly 
} 

int main() 
{ 
    int array[4]; 
    func(array); 
} 

जिसके अनुसार, के रूप में दूसरों को पहले से ही बताया है आउट, std::vector शायद यहां सबसे अच्छा समाधान है।

+0

यह दिलचस्प है। – CiscoIPPhone

+0

लेकिन अनावश्यक, क्योंकि func के अंदर आपको टेम्पलेट-पैरामीटर एन मिला है जिसमें एक ही जानकारी है (एक संकलन समय स्थिर के रूप में)। –

+0

@ फैबियो - दाएं, ध्यान दिया। –

0

साथ ही वेक्टर जो सुझाव दिया गया है कि आप संभवतः वालराय का उपयोग कर सकते हैं जो एसटीएल का भी हिस्सा है और इसका उद्देश्य विशिष्ट रूप से गणितीय संग्रह को संभालने के लिए है।

0

आपको क्या पता होना चाहिए, यह है कि सरणी पॉइंटर्स हैं। int array[5] जैसी परिभाषा स्टैक पर 5 पूर्णांक के लिए स्थान आवंटित करेगी और array पहले मान का पता होगा। इस प्रकार, सरणी में पहला मान तक पहुँचने के लिए, आप

array[0] या *array

उसी तरह तीसरे तत्व का पता पुनः प्राप्त करने में (जो *(array + 0) रूप में ही है), तो आप

लिख सकते हैं लिख सकते हैं

&array[2] या array + 2

के बाद से सरणियों कर रहे हैं संकेत दिए गए, तो आप अपने सरणी के क्रम आकार के बारे में चिंता करने की अगर आप एक समारोह के लिए इसे पारित करने के लिए बस एक सूचक के रूप में इसे पारित करना चाहते हैं की जरूरत नहीं है:

void func(int *array) 
{ 
    int size; 
    //compute size of the array 
    for (int i = 0; i < size; ++i) 
    { 
     //do whatever you want with array[i] 
    } 
}

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