الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

لمحة : كيف تعرف حجم أي مصفوفة ستاتيكية بطريقتين .

بدأه Abdullah.Alshammeri في 24 يوليو 2009 · 2 رد · 4,233 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

وجدت الدروس قليلة عن المصفوفات في لغة السي أو السي بلس ( بالنظر في كتاب المنتدى - للمبتدئين ) , لذلك هذه اللمحة لاكمال بعض النواقص .

حجم مصفوفة ستاتيكية ( وليست ديناميكية ) :

لنفرض أنك تريد استقبال مصفوفة في دالّة .. أو في أي مكان , وتحتاج لمعرفة حجم المصفوفة , هناك حلّين , امّا أن تطلب من المبرمج ادخال طول المصفوفة , أو أن لديك معرفة سابقة بهذا الحجم , مثال :

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

تم تعديل هذه المشاركة بواسطة الشمري في 24 يوليو 2009 في 02:02

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

السلام عليكم ...

جميل جداً,

الحقيقية حتى أنا لم أستطع فهم هذا :lol: :

template<typename T, int size>
int GetArrLength(T(&)[size]){return size;}

أعمل حل هذه الشفرة العجيبة... و لكن حتى ذلك الوقت دعني أقدمك إلى array :)

post-89451-1248396216_thumb.png

ملاحظة فقط, هذه الـ array العجيبة zero-overhead أي أنها لن تكلفك لا ذاكرة إضافية و لا معالجة إضافية, تماماً كأنها المصفوفات الأصلية في ++C.

إن كانت المشكلة تستدعي استعمال مصفوفة ديناميكية و هو الغالب, فعليك بـ vector بالطبع :)

أرجو أن لا أكون عامل إزعاج بـ boost طول الوقت :)

تحياتي ...

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 24 يوليو 2009 في 03:47

#3

السلام عليكم...

موضوع جميل, شكراً اخي الشمري

و لكن ما معنى Static Array ؟

حسناً...

المقصود بها static array و بطبيعتها لغة ++C كل المصفوفات فيها من نوع Static و هي مصفوفات مستقرة و تعني أننا لا نستطيع تغيير حجمها أو اضافة عناصر اجديدة لها لاحقاً بعد التعريف الأول للمصفوفة و بعد تعيين الحجم المناسب لها او حتى اسناء تنفيد البرنامح

At run-time

آسفة لو كانت اضافتي ابتدائية ولكن بلكي حدا بيسأل بكرة

:ty:

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

مواضيع مشابهة