নিম্নলিখিত কোড সহ আমি কেন "পরিবর্তনশীল-আকারের অবজেক্টটি আরম্ভ করা যেতে পারে না" ত্রুটিটি পাব?
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
হতে static
? সি ++ 14 এ এটি সূক্ষ্মভাবে কাজ করে।
malloc
প্রয়োজন হয় না তা জানতে চাই ।
আপনি এই ত্রুটিটি পান কারণ সি ভাষায় আপনাকে পরিবর্তনশীল দৈর্ঘ্যের অ্যারে সহ প্রারম্ভিক ব্যবহার করার অনুমতি নেই। আপনি যে ত্রুটি বার্তাটি পাচ্ছেন তা মূলত এটি সব বলে।
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 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;
}
সি ++ এর মতো পৃথক ঘোষণা এবং প্রারম্ভিককরণের জন্য ..
int a[n][m] ;
a[n][m]= {0};
তুমি এটা করতে পারবেনা. সি সংকলক স্ট্যাকের উপর এ জাতীয় জটিল জিনিস করতে পারে না।
আপনাকে গাদা এবং গতিশীল বরাদ্দ ব্যবহার করতে হবে।
আপনার সত্যিই যা করা দরকার:
ম্যাট্রিক্সের সাথে ইন্টারঅ্যাক্ট করতে * অ্যাক্সেস (বোর্ডআক্স, এক্স, ওয়াই, আকার) = 42 ব্যবহার করুন।