السلام عليكــم ورحمـة الله وبركاتــه ،،
وجدت الدروس قليلة عن المصفوفات في لغة السي أو السي بلس ( بالنظر في كتاب المنتدى - للمبتدئين ) , لذلك هذه اللمحة لاكمال بعض النواقص .
حجم مصفوفة ستاتيكية ( وليست ديناميكية ) :
لنفرض أنك تريد استقبال مصفوفة في دالّة .. أو في أي مكان , وتحتاج لمعرفة حجم المصفوفة , هناك حلّين , امّا أن تطلب من المبرمج ادخال طول المصفوفة , أو أن لديك معرفة سابقة بهذا الحجم , مثال :
void func(int arr[],int n)
{
for (int i=0;i<n;i++)
{
std::cout << arr << std::endl;
}
}لكن هذا عمل ممل وغير عملي , وبالنظر للغات الحديثة كلغة الجافا ولغات الدوت نت , يوجد متغيّر اسمه length كعضو في أي مصفوفة .
int []a = new int[10]; int length = a.length;
الحل :
يمكن معرفة حجم أي مصفوفة بالاستفادة من المعامل sizeof
مثال :
#include <iostream>
int main()
{
int intArray[100];
std::cout <<sizeof(intArray)/sizeof(int)<<"\n";
return 0;
}طريقة أخرى :
يمكن حساب حجم أي مصفوفة ستاتيكية , باستخدام Template ، حيث نعمل دالّة بسيطة تستقبل مصفوفة ذات طول معيّن size , وأثناء الترجمة يتحوّل size الى القيمة المقابلة له .. عموماً لست متأكد تماماً من فهمي لهذه الطريقة , ولكن أظنها هكذا تعمل , هل يعرف أحد شرح أكثر دقّة من هذا :D ؟ .. في الحقيقة .. هذه الطريقة غريبة , لم أتوقّع أن تقوم Template بهذا .. ؟
template<typename T, int size>
int GetArrLength(T(&)[size]){return size;}
void main()
{
int arr[17];
int arrSize = GetArrLength(arr);
std::cout << arrSize << std::endl;
return 0;
}ملاحظات :
- الطرق السابقة تنفع مع المصفوفة الستاتيكية فقط .
- يمكن استخدام الطريقتين السابقتين مع مصفوفة كائنات Objects ، لكن لا أعرف اذا كانت تلك طريقة آمنة ( بأخذ مشكلة Class Padding/Packing بعين الاعتبار .. ( أو ما تسمّى بـ Data structure alignment) ).
- يمكن استخدام vector أو list كمصفوفة ديناميكية ويمكنك حينها معرفة طول المصفوفة بسهولة.
- يمكنك بناء مصفوفة ديناميكة بسيطة خاصة بك تكون شبيهة بمصفوفة الجافا أو لغات الدوت نت باستخدام Class صغير وبسيط .
- المصدر : http://www.dev102.com/2009/01/12/c-tip-how...t-array-length/
خلّصنا :D



