2011-11-03 17 views
5
const int num = 16; 
struct inputs{ 
     double X1[num]; 
     double X2[num]; 
}; 

मुझे एक त्रुटि देता है:सी के लिए सरणी आकार घोषणा मतभेद और सी ++

error: variably modified ‘X1’ at file scope

ही 'X2' के लिए सच था।

लेकिन मुझे याद है कि उपरोक्त सी ++ के लिए ठीक है, ऊपर ठीक है (मुझे सी ++ के लिए गलत माना जा सकता है)।

क्या कोई मेरे लिए यह स्पष्ट कर सकता है?

उत्तर

3

हां, एक अंतर है। सी में, const वैरिएबल को अभी भी एक वास्तविक संकलन-समय स्थिर के रूप में नहीं माना जाता है (आधिकारिक तौर पर, इसे constant expression के हिस्से की अनुमति नहीं है), इसलिए इसकी अनुमति नहीं है। नोट, हालांकि, हालांकि सी को यह आवश्यक नहीं है कि संकलक इसे अनुमति दे, मानक मानक अभिव्यक्ति के अन्य रूपों को स्वीकार करने के लिए कार्यान्वयन के लिए अनुमति देता है, इसलिए यह चुनने पर इसे स्वीकार करने के लिए स्वतंत्र है।

सी ++ में, const चर को निरंतर माना जाता है, इसलिए इसकी अनुमति है।

दिलचस्प है, मोटे तौर पर रिवर्स सच है जब आप एक मूल्य के एक समारोह पैरामीटर के रूप में पारित कर दिया उपयोग करें:

void f(int size) { 
    int array[size]; 
} 

यह है सी में अनुमति दी है, लेकिन सी में नहीं ++। यह variably modified सरणी है; आपको जो त्रुटि संदेश मिल रहा है वह मूल रूप से आपको यह बताने की कोशिश कर रहा है कि इन्हें केवल कार्यों के अंदर ही अनुमति दी गई है।

+0

सी में, आप एक सरणी के आकार को किसी फ़ंक्शन में पास कर सकते हैं? सीखा ! धन्यवाद! – Rich

+0

@Rich: हाँ, लेकिन केवल तभी जब आपका कंपाइलर सी 99 (कम से कम इस संबंध में) के अनुरूप है - यह C89/90 में शामिल नहीं था (हालांकि यह पुराने कंपाइलर्स के साथ भी काफी आम विस्तार था)। –

8

मैं आपको C FAQ: I don't understand why I can't use const values in initializers and array dimensions पर इंगित कर सकता हूं।

यह मूल रूप से कहता है कि num एक वास्तविक स्थिर नहीं है, यह केवल पढ़ने के लिए है। एक वास्तविक स्थिरता प्राप्त करने के लिए आपको #define num 16 की आवश्यकता होगी।

इसके अलावा उस पृष्ठ पर: सी इस संबंध में C++ के विपरीत है

0

संरचना में नहीं। आप इसे स्थानीय दायरे में कर सकते हैं।

+0

सी के लिए भी? अन्य उत्तरों के मुताबिक, सी के लिए यह संभव नहीं है शायद सी ++ के लिए ठीक है? – Rich

+3

केवल सी 99 में, सी 8 9 में नहीं। –

+0

मुझे एडम पर भरोसा होगा, क्योंकि मुझे सटीक मानकों को याद नहीं है। उनका संस्करण सराहनीय लगता है। –

0

आपको निरंतर मूल्य का उपयोग करना होगा। तो सी में आपको इस संबंध में #define का उपयोग करना होगा। सी ++ के लिए यह ठीक होगा।

उपयोग इस बजाय:

#define num 16 
struct inputs{ 
    double X1[num]; 
    double X2[num]; 
}; 
+0

गलती .. '# परिभाषित 'दायरे में? –

+0

शब्द की खराब पसंद, मतलब का मतलब है। –

+0

यह बेहतर है :) –

0

सी ++ में, संकलन समय स्थिरांक सरणी घोषणाओं में लंबाई और const चर के रूप में इस्तेमाल किया जा सकता है (केवल उनमें से कुछ) संकलन समय स्थिरांक हो सकता है। यही कारण है कि यह सी ++ में काम करेगा।

सी, हालांकि, एक ऐसी सुविधा है जो समान, चर-लंबाई सरणी दिखती है। इसका मतलब है कि आप सरणी लंबाई के रूप में किसी भी पूर्णांक अभिव्यक्ति (यहां तक ​​कि रनटाइम गणना) का उपयोग कर सकते हैं, लेकिन केवल स्थानीय चर के लिए। यही कारण है कि आपका कंपाइलर फ़ाइल स्कोप पर "विविध रूप से संशोधित 'एक्स 1' " के बारे में शिकायत करता है।

0

जैसा कि पहले से ही कहा गया है सी और सी ++ निरंतर पूर्णांक अभिव्यक्तियों के संबंध में अलग हैं।

लेकिन आपको मैक्रो का उपयोग करने की आवश्यकता नहीं है क्योंकि अन्य लोगों ने कोड के साथ सुझाव दिया है जो दोनों के साथ काम करता है। यदि आप इसे "स्कोप" के साथ करना चाहते हैं तो आप इसे एक गणना निरंतर कर सकते हैं।कुछ

enum { num = 16 }; 
struct inputs { 
    double X1[num]; 
    double X2[num]; 
}; 

दोनों के लिए काम करेगा, भले ही आप इसे फ़ाइल या फ़ंक्शन स्कोप में रखें।

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