অ্যারে [এন] বনাম অ্যারে [10] - ভেরিয়েবল বনাম আসল সংখ্যার সাথে আরে সূচনা করা হচ্ছে


91

আমার কোডটি নিয়ে আমি নিম্নলিখিত সমস্যাটি নিয়ে আসছি:

int n = 10;
double tenorData[n]   =   {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

নিম্নলিখিত ত্রুটি প্রদান করে:

error: variable-sized object 'tenorData' may not be initialized

যেখানে double tenorData[10]কাজ ব্যবহার করছে ।

কেউ জানেন কেন?


4
এটি একটি ভাষা দিতে সহায়তা করবে। সি ++ এ আপনার ফর্মের অ্যারেগুলির একটি সংকলন-সময় ধ্রুব আকার থাকতে হবে।
অরেঞ্জআলমন্ডসোপ

সি ++, মিংডব্লিউ 32-জি ++ সংকলক সহ কোডব্লকগুলি ব্যবহার করে!
এমএসএমএফ 14

ধন্যবাদ, জাস্টিন এবং @ অ্যান্ড্রু ভারনারিন, এটি সমাধান করেছে! int এর আগে কনড যুক্ত করা: const int n = 10; সলভ!
এমএসএমএফ 14

উত্তর:


189

সি ++ এ, পরিবর্তনশীল দৈর্ঘ্যের অ্যারেগুলি বৈধ নয়। জি ++ এটিকে একটি "এক্সটেনশন" হিসাবে অনুমতি দেয় (কারণ সি এটি অনুমতি দেয়), তাই জি ++ এ ( -pedanticসি ++ মান অনুসরণ না করে) আপনি এটি করতে পারেন:

int n = 10;
double a[n]; // Legal in g++ (with extensions), illegal in proper C++

আপনি যদি একটি "ভেরিয়েবল দৈর্ঘ্যের অ্যারে" চান (সি ++ এর মধ্যে আরও ভালভাবে "ডায়নামিক আকারের অ্যারে" বলা হয়, যেহেতু যথাযথ ভেরিয়েবল দৈর্ঘ্যের অ্যারে অনুমোদিত নয়), আপনাকে হয় গতিশীলভাবে মেমরি নিজেই বরাদ্দ করতে হবে:

int n = 10;
double* a = new double[n]; // Don't forget to delete [] a; when you're done!

অথবা, আরও ভাল, একটি স্ট্যান্ডার্ড ধারক ব্যবহার করুন:

int n = 10;
std::vector<double> a(n); // Don't forget to #include <vector>

আপনি যদি এখনও কোনও সঠিক অ্যারে চান তবে এটি তৈরি করার সময় আপনি একটি ধ্রুবক ব্যবহার করতে পারেন , পরিবর্তনশীল নয়:

const int n = 10;
double a[n]; // now valid, since n isn't a variable (it's a compile time constant)

একইভাবে, আপনি যদি সি ++ 11 এ কোনও ফাংশন থেকে আকার পেতে চান তবে আপনি এটি ব্যবহার করতে পারেন constexpr:

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression

4
ধন্যবাদ, এটি আরও একটি ভাল সমাধান। আমার শেষ পর্যন্ত যা দরকার তা হ'ল অ্যারের পরিবর্তে ভেক্টর!
এমএসএমএফ 14

4
@ এমএসএমএফ 14: হ্যাঁ, স্ট্যান্ডার্ড পাত্রে যেমন vectorঅবিশ্বাস্যভাবে কার্যকর।
কর্নস্টালক

আপনি যখন "স্টাড :: ভেক্টর <[কিছু শ্রেণি]> এ (এন);" বলছেন তখন ভেক্টর সলিউশন কি প্রতিটি উপাদান সূচনা করে?
জাস্টিন

4
আপনি যদি খুব বেশি বরাদ্দ না দিচ্ছেন (স্ট্যাকের আকারের তুলনায় এটি যদি ছোট হয়) তবে আমি বরাদ্দ (3) এবং নতুন স্থান নির্ধারণের সাথে স্ট্যাক মেমরি ব্যবহার করতে পছন্দ করব। এইভাবে আপনার স্মৃতি মুক্ত করার বিষয়ে চিন্তা করার দরকার নেই, এবং মেমরির বরাদ্দ অনেক দ্রুত।
হলগ্যাক

4
জি ++ উল্লেখ করার জন্য +1 এটির অনুমতি দেয়। কারণ আমি এই ত্রুটিটি পর্যবেক্ষণ করি নি এবং এটি পার্থক্যটি ব্যাখ্যা করে।
gebbissimo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.