2012-03-05 9 views
15

मैं सी है कि मैं निम्नलिखित कर सकते हैं में पता है।घोषणा के अलावा समय पर सी सरणी शुरू करना?

int test[5] = {1, 2, 3, 4, 5}; 

अब सरणी घोषित करते समय यह केवल कानूनी है। हालांकि मैं सोच रहा था कि बाद में ऐसा करने के लिए कानूनी क्यों नहीं है? लेकिन बाद में कार्यक्रम में निम्नलिखित करने के लिए कानूनी नहीं है।

test[5] = {10, 20, 30, 40, 50}; 

या कुछ समान। ऐसा क्यों है? मुझे पता है कि यह कानूनी नहीं है, और मैं शिकायत नहीं कर रहा हूं, लेकिन क्या कोई मुझे एक और तकनीकी स्पष्टीकरण दे सकता है कि मैं ऐसा क्यों नहीं कर सकता? (यानी केवल यह नहीं कहें कि सी स्पेक इसे या कुछ ऐसा करने की अनुमति नहीं देता है)

मुझे लगता है कि इसे उस समय के साथ कुछ करना है जब स्मृति को सरणी के लिए ढेर पर आवंटित किया जाता है, इसलिए उस बिंदु पर सी मेरे मूल्यों को स्वतः भर सकता है, लेकिन फिर बाद में ऐसा क्यों नहीं कर सकता?

धन्यवाद लोग

+2

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

+1

@ निकलासबी .: मुझे लगता है कि उस मामले में एक अच्छी तरह से तर्क दिया गया अनुमान लगाया गया है कि क्यों * सी भाषा के डिजाइनरों ने इस सुविधा को छोड़ने का फैसला किया है, यह एक जवाब के रूप में ठीक होगा। – Heinzi

+0

@ हिनजी: ओह, मैं देखता हूं :) –

उत्तर

6

मुद्दा यह है कि int array[]={ } का उपयोग कर घोषित और आरंभ वस्तु आपके द्वारा बनाए गए है।

आप वास्तव में मूल्यों एक सरणी को के बाद प्रदान कर सकते हैं यह घोषित कर दिया गया है:

int array[5]; 
array[0] = 1, array[1] = 2, ... 

क्या आप कई मान निर्दिष्ट किया गया था कर रहे थे एक एकल सरणी प्रविष्टि के लिए:

array[5] = {1,2,3,4,5}; // array[5] can only contain one value 

यह wo उल के बदले कानूनी हो:

array[5] = 6; 

आशा है कि यह समझ में आता है। सिंटैक्स का सिर्फ एक प्रश्न।

+0

ओह। Duhhh। यह वास्तव में मेरी मदद की। – kando

17

यह सिर्फ सरणी नहीं है, आप परिभाषा के अलावा किसी अन्य बिंदु पर कुछ भी के लिए प्रारंभकर्ता प्रदान नहीं कर सकते हैं। लोग कभी कभी "i आरंभ" के रूप में int i; i = 0; की तरह कुछ का दूसरा स्टेटमेंट देखें। असल में यह i को असाइन कर रहा है, जो पहले अनिश्चित मान रखता था क्योंकि इसे प्रारंभ नहीं किया गया था। यह "प्रारंभिक" कहने के लिए बहुत ही कम भ्रमित है, लेकिन जहां तक ​​भाषा का संबंध है वहां कोई प्रारंभिक नहीं है।

असाइनमेंट और आरंभीकरण भाषा के लिए अलग बातें हैं, भले ही वे दोनों = चरित्र का उपयोग करें। Arrays असाइन करने योग्य नहीं हैं।

कारण सरणियों आबंटित उदाहरण Why does C++ support memberwise assignment of arrays within structs, but not generally? के लिए, कहीं और कवर किया जाता है नहीं कर रहे हैं। संक्षिप्त जवाब है, "ऐतिहासिक कारण"। मुझे नहीं लगता कि कोई हत्यारा तकनीकी कारण है कि क्यों सरणी असाइनमेंट की अनुमति देने के लिए भाषा को बदला नहीं जा सका।

एक माध्यमिक मुद्दा है, जो व्याकरणिक रूप से {1, 2, 3, 4, 5} एक प्रारंभिक है, एक सरणी शाब्दिक नहीं है, और इसलिए सरणी असाइन करने योग्य होने पर भी असाइनमेंट में उपयोग नहीं किया जा सकता है। मुझे यकीन नहीं है कि सी 8 9 में सरणी अक्षर क्यों नहीं हैं, शायद किसी को भी उनकी आवश्यकता के लिए चारों ओर नहीं मिला। (int[]) {1, 2, 3, 4, 5}: C99 "यौगिक शाब्दिक" सामान्य और सरणी शाब्दिक में विशेष रूप से के लिए एक वाक्य रचना प्रस्तुत करता है।आप अभी भी एक सरणी को असाइन नहीं कर सकते हैं।

3

ध्यान दें कि C99 यौगिक शाब्दिक आप 'कार्यों के लिए सरणियों पारित' कर सकते हैं:

int your_func(int *test) 
{ 
    ...use test as an array... 
} 

void other_func(void) 
{ 
    int x = rand(); 
    if (your_func((int[]){ 0, 1, 2, x, 3, 4 }) > 0 || 
     your_func((int[]){ 9, x, 8, 7, 6, 5 }) > 0) 
     ...whatever... 
} 

यह वही के रूप में विभिन्न मूल्यों के साथ एक सरणी फिर से आरंभ नहीं है, लेकिन यह पर्याप्त रूप से करीब है कि हो सकता है यह आपके लिए काम करता है।

0

सतह पर इसका कारण यह है कि सरणी लगभग हर जगह एक सूचक को पहले तत्व में परिवर्तित कर देती हैं। आप दो सरणियों

double A[5]; 
double B[5]; 

एक अभिव्यक्ति जैसे

A = B; 

दोनों पहले से ही संकेत करने के लिए परिवर्तित कर रहे हैं में है। बाईं ओर A विशेष रूप से "lvalue" नहीं है, इसलिए आप इसे असाइन नहीं कर सकते हैं।

यह एक लंगड़ा बहाना की तरह लगता है, लेकिन मेरा अनुमान है कि ऐतिहासिक रूप से यह ऐसा ही हुआ। सी (और इसके साथ सी ++) प्रारंभिक वाक्यविन्यास पसंद में फंस गया था और यदि आप विरासत कोड के साथ संगत रहना चाहते हैं तो संभवतः इसमें से कोई रास्ता नहीं है।

+0

क्या आपके पास कोई उद्धरण है कि डिजाइन निर्णय के पीछे यही कारण था? –

+0

@ डेविड हेफरन, दुर्भाग्य से नहीं, अन्यथा मैं इसे दिया होता। सी 11 में, 6.7.1 पी 6 (प्लस फुटनोट) अभी भी दिखाता है कि एक पॉइंटर में कनवर्ट करने के लिए यह दायित्व सरणी की बहुत ही बुनियादी विशेषता के रूप में लिया जाता है। मुझे लगता है कि यह दुर्भाग्यपूर्ण है, विशेष रूप से असाइनमेंट और डिज़ाइनर के पास अच्छी सुविधाएं होंगी। लेकिन ऐसा संशोधन होने की अपेक्षा करना अवास्तविक होगा। –

+0

लेकिन उद्धरण के बिना यह अनुमान है। और मैं वास्तव में एक तकनीकी कारण नहीं देख सकता कि क्यों सरणी का असाइनमेंट लागू नहीं किया जा सका। –

2

यहाँ,,

//Declaration 
int a[5]; 
int a_temp[5] = {1, 2, 3, 4, 5 }; 
memcpy(a, a_temp, sizeof(a)); 
//Now array a have values 1, 2, 3, 4, 5 

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

  • कोई संबंधित समस्या नहीं^_^