ऐरे [एन] बनाम ऐरे [10] - वेरिएबल बनाम वास्तविक संख्या के साथ प्रारंभिक सरणी


90

मुझे अपने कोड के साथ निम्नलिखित समस्या हो रही है:

int n = 10;
double tenorData[n]   =   {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

निम्न त्रुटि देता है:

error: variable-sized object 'tenorData' may not be initialized

जबकि double tenorData[10]काम करता है।

किसी को पता है क्यों?


4
यह एक भाषा देने में मदद करेगा। C ++ में उस फॉर्म के आपके सरणियों को एक संकलन-समय स्थिर आकार की आवश्यकता होती है।
ऑरेंजअल्मंड्सअप

C ++, mingw32-g ++ कंपाइलर के साथ कोडब्लॉक का उपयोग करते हुए!
msmf14

धन्यवाद, जस्टिन और @AndrewVarnerin, कि इसे हल किया! int से पहले जोड़ा गया const: const int n = 10; हल किया!
msmf14

जवाबों:


188

C ++ में, वैरिएबल लंबाई सरणियाँ कानूनी नहीं हैं। G ++ इसे "एक्सटेंशन" के रूप में अनुमति देता है (क्योंकि C इसे अनुमति देता है), इसलिए G ++ में ( -pedanticC ++ मानक का पालन किए बिना ), आप कर सकते हैं:

int n = 10;
double a[n]; // Legal in g++ (with extensions), illegal in proper C++

यदि आप "वैरिएबल लेंथ एरे" चाहते हैं (C ++ में "डायनामिक साइज ऐरे" कहा जाता है, क्योंकि उचित वैरिएबल एरे को अनुमति नहीं दी जाती है), तो आपको या तो डायमेंशनली खुद को मेमोरी आवंटित करनी होगी:

int n = 10;
double* a = new double[n]; // Don't forget to delete [] a; when you're done!

या, बेहतर अभी तक, एक मानक कंटेनर का उपयोग करें:

int n = 10;
std::vector<double> a(n); // Don't forget to #include <vector>

आप अभी भी एक उचित सरणी चाहते हैं, आप एक का उपयोग कर सकते निरंतर , नहीं एक चर जब यह बनाने,:

const int n = 10;
double a[n]; // now valid, since n isn't a variable (it's a compile time constant)

इसी तरह, यदि आप C ++ 11 में एक फ़ंक्शन से आकार प्राप्त करना चाहते हैं, तो आप एक का उपयोग कर सकते हैं constexpr:

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression

1
धन्यवाद, यह एक और अच्छा उपाय है। क्या मैं वास्तव में अंत में जरूरत है एक सरणी के बजाय एक वेक्टर है!
msmf14

1
@ msmf14: हाँ, मानक कंटेनर, जैसे vector, अविश्वसनीय रूप से उपयोगी हैं।
कॉर्नस्टॉक

जब आप "std :: वेक्टर <[कुछ वर्ग]> (n)?" कहते हैं, तो क्या वेक्टर समाधान प्रत्येक तत्व को इनिशियलाइज़ करता है?
जस्टिन

3
यदि आप बहुत अधिक आवंटन नहीं कर रहे हैं (यदि यह स्टैक आकार की तुलना में छोटा है), तो मैं ऑलोका (3) और प्लेसमेंट नए के साथ स्टैक मेमोरी का उपयोग करना पसंद करूंगा। इस तरह से आपको मेमोरी को फ्री करने के बारे में चिंता करने की आवश्यकता नहीं है, और मेमोरी आवंटन बहुत तेज है।
होलागैक

2
+1 यह उल्लेख करने के लिए कि g ++ इसकी अनुमति देता है। क्योंकि मैंने इस त्रुटि का पालन नहीं किया और यह अंतर बताता है।
गब्बिसिमो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.