এটি ব্যাখ্যা করা আসলেই খুব শক্ত, তবে আমি এটি দিয়ে যাব ...
প্রথমত, dimof
আপনাকে অ্যারের মধ্যে মাত্রা বা উপাদানগুলির সংখ্যা বলে tells (আমি বিশ্বাস করি উইন্ডোজ প্রোগ্রামিং পরিবেশে "মাত্রা" পছন্দসই পরিভাষা)।
এটি প্রয়োজনীয় কারণ C++
এবং C
আপনাকে অ্যারের আকার নির্ধারণের জন্য কোনও দেশীয় উপায় দেয় না।
প্রায়শই লোকেরা ধরে sizeof(myArray)
নেবে কাজ করবে তবে এটি উপাদানগুলির সংখ্যার চেয়ে আসলে আপনাকে মেমরির আকার দেবে। প্রতিটি উপাদান সম্ভবত 1 বাইট মেমরি লাগে!
পরবর্তী, তারা চেষ্টা করতে পারে sizeof(myArray) / sizeof(myArray[0])
। এটি অ্যারের স্মৃতিতে আকার দেবে, প্রথম উপাদানটির আকার দ্বারা বিভক্ত। এটি ঠিক আছে, এবং C
কোডে বহুল ব্যবহৃত । এটির সাথে প্রধান সমস্যাটি হ'ল আপনি যদি অ্যারের পরিবর্তে কোনও পয়েন্টারটি পাস করেন তবে এটি কাজ করবে। মেমোরিতে একটি পয়েন্টারের আকারটি সাধারণত 4 বা 8 বাইট হতে হবে, যদিও এটি যে জিনিসটিকে নির্দেশ করে তা হ'ল উপাদানগুলির একটি অ্যারে হতে পারে।
সুতরাং চেষ্টা করার পরবর্তী জিনিস C++
হ'ল টেমপ্লেটগুলি এমন কিছু বল প্রয়োগ করার জন্য ব্যবহার করা যা কেবল অ্যারেগুলির জন্য কাজ করে এবং একটি পয়েন্টারে সংকলক ত্রুটি দেয়। দেখে মনে হচ্ছে:
template <typename T, std::size_t N>
std::size_t ArraySize(T (&inputArray)[N])
{
return N;
}
//...
float x[7];
cout << ArraySize(x); // prints "7"
টেমপ্লেটটি কেবল একটি অ্যারের সাথে কাজ করবে। এটি প্রকারটি (আসলে প্রয়োজন হয় না, তবে কাজ করতে টেমপ্লেটটি পেতে সেখানে উপস্থিত থাকতে হবে) এবং অ্যারের আকারটি হ্রাস করবে, তারপরে এটি আকারটি দেয়। টেমপ্লেটটি যেভাবে লিখিত হয়েছে সম্ভবত পয়েন্টার দিয়ে কাজ করতে পারে না।
সাধারণত আপনি এখানে থামতে পারেন, এবং এটি সি ++ স্ট্যান্ডার্ড লিবারিতে রয়েছে std::size
।
সতর্কতা: নীচে এটি লোমশ ভাষা-আইনী অঞ্চলে যায়।
এটি বেশ দুর্দান্ত, তবে এখনও একটি অস্পষ্ট প্রান্ত ক্ষেত্রে ব্যর্থ:
struct Placeholder {
static float x[8];
};
template <typename T, int N>
int ArraySize (T (&)[N])
{
return N;
}
int main()
{
return ArraySize(Placeholder::x);
}
মনে রাখবেন যে, অ্যারের x
হয় ঘোষিত , কিন্তু না সংজ্ঞায়িত । এটির সাথে কোনও ফাংশন (অর্থাত্ ArraySize
) কল করতে x
অবশ্যই সংজ্ঞা দিতে হবে ।
In function `main':
SO.cpp:(.text+0x5): undefined reference to `Placeholder::x'
collect2: error: ld returned 1 exit status
আপনি এটি লিঙ্ক করতে পারবেন না।
আপনার প্রশ্নে কোডটি চারপাশের উপায়। প্রকৃতপক্ষে কোনও ফাংশন কল করার পরিবর্তে আমরা একটি ফাংশন ঘোষণা করি যা সঠিক আকারের একটি অবজেক্ট দেয় । তারপরে আমরা সেই sizeof
কৌশলটি ব্যবহার করি।
এটা তোলে দেখায় হচ্ছে আমরা ফাংশন কল, কিন্তু sizeof
তাই ফাংশন আসলে বলা হয়, একটি সময় সঙ্কলন কনস্ট্রাক্ট বিশুদ্ধরূপে হয়।
template <typename T, size_t N>
char(&DimofSizeHelper(T(&array)[N]))[N];
^^^^ ^ ^^^
// a function that returns a reference to array of N chars - the size of this array in memory will be exactly N bytes
নোট করুন আপনি আসলে কোনও ফাংশন থেকে কোনও অ্যারে ফিরিয়ে দিতে পারবেন না তবে আপনি কোনও অ্যারের রেফারেন্স দিতে পারেন।
তারপরে DimofSizeHelper(myArray)
একটি অভিব্যক্তি যা এর টাইপN
char
গুলি এর উপর একটি অ্যারে । এক্সপ্রেশনটি আসলে রানযোগ্য হতে হবে না, তবে সংকলনের সময় এটি বোধগম্য।
অতএব sizeof(DimofSizeHelper(myArray))
আপনি সংকলনের সময় আকারটি আপনাকে বলবেন যদি আপনি আসলে ফাংশনটি কল করেন তবে আপনি কী পাবেন। যদিও আমরা আসলে এটি কল করি না।
যদি এই শেষ ব্লকটি কোনও অর্থবোধ না করে তবে চিন্তা করবেন না। উদ্ভট প্রান্তের কেসটি ঘিরে কাজ করা একটি উদ্ভট কৌশল। এ কারণেই আপনি নিজেরাই এই ধরণের কোডটি লেখেন না এবং লাইব্রেরি প্রয়োগকারীরা এই ধরণের বাজে কথা সম্পর্কে উদ্বিগ্ন হন।
std::array
std::vector