सी ++ में सीएक्स के रूप में अंतिम तत्व के समान लचीला सरणी सदस्य नहीं है। यदि आपको नहीं पता कि आपको कितने तत्व हैं या आपको यह निर्दिष्ट करना चाहिए कि आप कितने हैं तो आपको std::vector
का उपयोग करना चाहिए।
संपादित करें: आपने अपने संपादन में कहा है कि सरणी रनटाइम स्थिर है, इसलिए आकार निर्दिष्ट करें और इसे ठीक काम करना चाहिए। जी ++ निम्न कोड के साथ कोई समस्या नहीं है:
struct TestStruct { // note typedef is not needed */
int length;
int values[3]; // specified the size
};
TestStruct t = {3, {0, 1, 2}};
int main() {
// main implicitly returns 0 if none specified
}
संपादित करें: अपनी टिप्पणी को संबोधित करने के लिए, आप इस तरह टेम्पलेट का उपयोग कर सकते हैं:
template <int N>
struct TestStruct {
int length;
int values[N];
};
TestStruct<3> t3 = {3, {0, 1, 2}};
TestStruct<2> t2 = {2, {0, 1}};
int main() {}
केवल समस्या का कोई आसान तरीका है कि वहाँ है दोनों कंटेनर में टी 2 और टी 3 डालें (जैसे सूची/वेक्टर/स्टैक/कतार/आदि क्योंकि उनके पास अलग-अलग आकार हैं। अगर आप इसे चाहते हैं, तो आपको std::vector
का उपयोग करना चाहिए। इसके अलावा, यदि आप ऐसा कर रहे हैं, तो यह आवश्यक नहीं है आकार को स्टोर करने के लिए (यह प्रकार से जुड़ा हुआ है)। तो आप इसके बजाय ऐसा कर सकते हैं:
template <int N>
struct TestStruct {
static const int length = N;
int values[N];
};
TestStruct<3> t3 = {{0, 1, 2}};
TestStruct<2> t2 = {{0, 1}};
int main() {}
लेकिन एक बार फिर, आप आसानी से "संग्रह" में टी 2 और टी 3 नहीं डाल सकते हैं।
संपादित करें: सभी सब में, यह आप की तरह लगता है (जब तक आप बस कुछ संख्या और आकार की तुलना में अधिक डाटा स्टोर) सब पर एक struct की जरूरत नहीं है, और सिर्फ एक सादे पुराने वेक्टर उपयोग नहीं कर सकते ।
typedef std::vector<int> TestStruct;
int t2_init[] = { 0, 1, 2 };
TestStruct t3(t3_init, t3_init + 3);
int t2_init[] = { 0, 1 };
TestStruct t2(t2_init, t2_init + 2);
int main() {}
जो आपको एक साथ संग्रह में टी 2 और टी 3 दोनों रखने की अनुमति देगा। दुर्भाग्य से std::vector
(अभी तक) सरणी शैली प्रारंभकर्ता वाक्यविन्यास नहीं है, इसलिए मैंने शॉर्टकट का उपयोग किया है। लेकिन एक अच्छा फैशन में वैक्टरों को पॉप्युलेट करने के लिए एक समारोह लिखना काफी आसान है।
संपादित करें: ठीक है, इसलिए आपको संग्रह की आवश्यकता नहीं है, लेकिन आपको इसे किसी फ़ंक्शन में पास करने की आवश्यकता है, आप टाइप सुरक्षा को संरक्षित रखने के लिए टेम्पलेट का उपयोग कर सकते हैं!
template <int N>
struct TestStruct {
static const int length = N;
int values[N];
};
TestStruct<3> t3 = {{0, 1, 2}};
TestStruct<2> t2 = {{0, 1}};
template <int N>
void func(const TestStruct<N> &ts) { /* you could make it non-const if you need it to modify the ts */
for(int i = 0; i < N; ++i) { /* we could also use ts.length instead of N here */
std::cout << ts.values[i] << std::endl;
}
}
// this will work too...
template <class T>
void func2(const T &ts) {
for(int i = 0; i < ts.length; ++i) {
std::cout << ts.values[i] << std::endl;
}
}
int main() {
func(t2);
func(t3);
func2(t2);
}
यह कानूनी सी ++ कोड नहीं है। सी ++ परिवर्तनीय-लंबाई सरणी या लचीली सरणी सदस्यों का समर्थन नहीं करता है। – rlbond
दरअसल, यह जीसीसी में काम करता है - आपको अपने कोड में एक अप्रासंगिक त्रुटि मिली है, आप इसे 'टाइपेडफ' प्राप्त करने के बाद संरचना का नाम भूल गए हैं। हालांकि, आपने प्रश्न को सी ++ के रूप में टैग किया है - मुझे नहीं पता कि आप यह क्यों करेंगे। Typedeffing structs का उपयोग सी * (सी ++ के विपरीत) * की सीमा को दूर करने के लिए किया गया था, जहां यह आपको अनावश्यक 'स्ट्रक्चर' कीवर्ड के बिना एक स्ट्रक्चर चर घोषित करने की अनुमति नहीं देता था। –