2010-06-21 19 views
58

मुझे निम्नलिखित कोड के साथ "वैरिएबल-साइज्ड ऑब्जेक्ट प्रारंभ नहीं किया जा सकता" त्रुटि क्यों प्राप्त होती है?सी संकलन त्रुटि: "परिवर्तनीय आकार का ऑब्जेक्ट प्रारंभ नहीं किया जा सकता है"

int boardAux[length][length] = {{0}}; 

उत्तर

71

मुझे लगता है कि आप एक सी 99 कंपाइलर (गतिशील आकार के सरणी के लिए समर्थन के साथ) का उपयोग कर रहे हैं। आपके कोड में समस्या यह है कि उस समय जब कंपेलर आपकी परिवर्तनीय घोषणा देखता है, यह नहीं जानता कि सरणी में कितने तत्व हैं (मैं संकलक त्रुटि से length संकलन समय स्थिर नहीं है)।

आप मैन्युअल कि सरणी को प्रारंभ करना होगा:

int boardAux[length][length]; 
memset(boardAux, 0, length*length*sizeof(int)); 
+0

मैं इस उद्देश्य के लिए मॉलोक के लिए भी उपयोग कर सकता हूं, दूसरे प्रश्न के बारे में, मैंने इसे पावेल के उत्तर – helloWorld

+0

@helloWorld के बाद लिखा था: स्टैक आवंटित सरणी के साथ, 'printf ("% d", boardAux [1] [2])' compiles ठीक। कंपाइलर आकार जानता है और जानता है कि स्मृति में कौन सी स्थिति (1,2) -थ तत्व है। यदि आप गतिशील आवंटन का उपयोग करते हैं तो सरणी एक-आयामी है और आपको गणित स्वयं करना होगा: 'printf ("% d ", boardAux [1 * लंबाई + 2])' –

+0

@AndreyT: 'स्मृति में त्रुटि को इंगित करने के लिए धन्यवाद कॉल आउट मैंने अभी इसे सही किया है। –

-5

आप इसे नहीं कर सकते हैं। सी संकलक ढेर पर ऐसी जटिल चीज नहीं कर सकता है।

आपको ढेर और गतिशील आवंटन का उपयोग करना होगा।

तुम सच में क्या करने की जरूरत:

  • गणना आकार (एन मीटर sizeof (तत्व)) स्मृति के आप
  • कॉल malloc (आकार) की जरूरत स्मृति को आबंटित करने
  • बनाने एक एक्सेसर: int * एक्सेस (पीआरटी, एक्स, वाई, पंक्ति आकार) {वापसी पीआरटी + वाई * पंक्ति आकार + एक्स; }

मैट्रिक्स के साथ बातचीत करने के लिए * एक्सेस (बोर्डएक्स, एक्स, वाई, आकार) = 42 का उपयोग करें।

+0

एक और प्रश्न, मैं क्यों अनिर्दिष्ट सीमा के साथ सरणी की एक त्रुटि अवैध उपयोग प्राप्त करते हैं? printf ("% d", बोर्ड [i] [j]); – helloWorld

+7

-1 सी 99 स्टैक में गतिशील आवंटन के लिए उपयोगकर्ता कोड (प्रारंभिक को छोड़कर) के रूप में अनुमति देता है। गतिशील आवंटन करने की कोई आवश्यकता नहीं है। –

+0

@helloWorld क्योंकि सरणी आयामों को जाना जाना चाहिए। –

17

आपको यह त्रुटि प्राप्त होता है क्योंकि सी भाषा में आप चर लंबाई सरणियों के साथ initializers उपयोग करने के लिए अनुमति नहीं है। आप जिस त्रुटि संदेश को मूल रूप से प्राप्त कर रहे हैं वह सब कुछ कहता है।

6.7.8 Initialization

...

3 The type of the entity to be initialized shall be an array of unknown size or an object type that is not a variable length array type.

+0

आपको यह कहां मिला, क्या आप मुझे एक लिंक दे सकते हैं? – helloWorld

+1

@helloWorld: यह भाषा मानक (सी 99) से है। आप यहां टीसी 3 अपडेट के साथ "काम करने वाली" प्रति प्राप्त कर सकते हैं http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf – AnT

+3

ऐसे विषय हैं जिनके लिए कुछ हमेशा आपको अविश्वास करेंगे यदि आप हमेशा अविश्वास करेंगे केवल अनौपचारिक स्पष्टीकरण प्रदान करें। परिवर्तनीय लंबाई सरणी इन विषयों में से एक हैं। मानक उद्धृत करने के लिए +1। –

6

इससे त्रुटि:

int len; 
scanf("%d",&len); 
char str[len]=""; 

यह भी त्रुटि देता है:

int len=5; 
char str[len]=""; 

लेकिन यह ठीक काम करता है:

int len=5; 
char str[len]; //so the problem lies with assignment not declaration 

आप निम्न में मूल्य डालने के लिए की जरूरत है रास्ता:

str[0]='a'; 
str[1]='b'; //like that; and not like str="ab"; 
0

सीधे शब्दों में, लंबाई की घोषणा एक विपक्ष होने के लिए अगर यह तो आप का आवंटन किया जाना चाहिए स्मृति गतिशील

+2

मुझे लगता है कि आपको देखने के लिए क्या मतलब है! – Holger

1

नहीं है सरणी

int boardAux[length][length]; 

शून्य के रूप में प्रारंभिक मान आवंटित करने के लिए सबसे आसान तरीका घोषणा के बाद लूप के लिए उपयोग कर रहा है, भले ही यह थोड़ा लंबा

int i, j; 
for (i = 0; i<length; i++) 
{ 
    for (j = 0; j<length; j++) 
     boardAux[i][j] = 0; 
} 
1

सी ++ के लिए अलग घोषणा और टी जैसे प्रारंभिक उसकी ..

int a[n][m] ; 
a[n][m]= {0}; 
संबंधित मुद्दे