मुझे निम्न कोड के साथ "चर-आकार की वस्तु को आरंभीकृत नहीं किया जा सकता" त्रुटि क्यों मिलती है?
int boardAux[length][length] = {{0}};
मुझे निम्न कोड के साथ "चर-आकार की वस्तु को आरंभीकृत नहीं किया जा सकता" त्रुटि क्यों मिलती है?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
जवाबों:
मैं मान रहा हूं कि आप एक C99 कंपाइलर (गतिशील रूप से आकार के सरणियों के लिए समर्थन के साथ) का उपयोग कर रहे हैं। आपके कोड में समस्या यह है कि जिस समय संकलक आपकी परिवर्तनशील घोषणा को देखता है वह यह नहीं जान सकता है कि सरणी में कितने तत्व हैं (मैं यह भी मान रहा हूँ, संकलक त्रुटि से जो length
संकलन समय स्थिर नहीं है)।
आपको उस सरणी को मैन्युअल रूप से प्रारंभ करना होगा:
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
printf( "%d", boardAux[1][2] )
ठीक संकलन करता है। संकलक आकारों को जानता है और जानता है कि स्मृति (1,2) -थ तत्व किस स्थिति में है। यदि आप डायनेमिक एलोकेशन का उपयोग करते हैं, तो सरणी printf("%d", boardAux[ 1*length + 2 ])
memset
कॉल आउट में त्रुटि को इंगित करने के लिए धन्यवाद । मैंने अभी इसे ठीक किया है।
length
होने के लिए सेट करता हूं तो मुझे C99 कंपाइलर में यह त्रुटि क्यों मिलती है static
? C ++ 14 में यह ठीक काम करता है।
आपको यह त्रुटि मिलती है क्योंकि C भाषा में आपको वैरिएबल लंबाई सरणियों के साथ इनिशियलाइज़र का उपयोग करने की अनुमति नहीं है। त्रुटि संदेश आपको मूल रूप से मिल रहा है, यह सब कहता है।
6.7.8 प्रारंभिक
...
3 इकाई के प्रकार को आरंभीकृत किया जाना एक अज्ञात आकार या एक वस्तु प्रकार का एक प्रकार होगा जो एक चर लंबाई सरणी प्रकार नहीं है।
यह त्रुटि देता है:
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";
सरणी घोषित करने के बाद
int boardAux[length][length];
प्रारंभिक मानों को निर्दिष्ट करने का सबसे सरल तरीका है क्योंकि शून्य लूप के लिए उपयोग कर रहा है, भले ही यह थोड़ा लंबा हो
int i, j;
for (i = 0; i<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}
memset
सरल और तेज है।
इस सवाल का जवाब पहले ही दिया जा चुका है, लेकिन मैं एक और उपाय बताना चाहता हूं जो तेजी से काम करता है और अगर रन-टाइम में लंबाई को बदलना नहीं है तो काम करता है। लंबाई को परिभाषित करने के लिए मुख्य () से पहले मैक्रो #define का उपयोग करें और मुख्य में () आपका इनिशियलाइज़ेशन काम करेगा:
#define length 10
int main()
{
int boardAux[length][length] = {{0}};
}
मैक्रों को वास्तविक संकलन से पहले चलाया जाता है और लंबाई एक संकलन-समय स्थिर होगी (जैसा कि उनके जवाब में डेविड रोड्रिग्ज ने कहा है)। यह वास्तव में संकलन से पहले 10 के साथ लंबाई स्थानापन्न करेगा।
बस लंबाई को एक विपक्ष घोषित करें, अगर ऐसा नहीं है तो आपको गतिशील रूप से मेमोरी आवंटित की जानी चाहिए
const int lenght=5; int array[length][length] = {{0}};
नहीं होगा।
int size=5;
int ar[size ]={O};
/* This operation gives an error -
variable sized array may not be
initialised. Then just try this.
*/
int size=5,i;
int ar[size];
for(i=0;i<size;i++)
{
ar[i]=0;
}
C ++ के लिए इस तरह से अलग घोषणा और आरंभीकरण ।।
int a[n][m] ;
a[n][m]= {0};
तुम यह नहीं कर सकते। सी कंपाइलर स्टैक पर ऐसी जटिल बात नहीं कर सकता है।
आपको ढेर और गतिशील आवंटन का उपयोग करना होगा।
आपको वास्तव में क्या करने की आवश्यकता है:
मैट्रिक्स के साथ बातचीत करने के लिए * एक्सेस (बोर्डअक्स, एक्स, वाई, साइज़) = 42 का उपयोग करें।