>> الصفحة الرئيسية >> اساسيات لغة سي++ >> تمرير المصفوفات كوسطاء للتوابع

الأقسام الرئيسية

 التنصيب والاعداد التنصيب والاعداد
 دروس متقدمة دروس متقدمة
 سلسلة دروس للمبتدئين سلسلة دروس للمبتدئين
 اساسيات لغة سي++ اساسيات لغة سي++
 مقالات ZetCode مقالات ZetCode
 

جديد الدروس

 الوحدة QtUiTools (واجهة المستخدم ديناميكية التوليد)
التاريخ 04/07/2009 الوحدة QtUiTools (واجهة المستخدم ديناميكية التوليد)
 Qt and Phonon
التاريخ 04/07/2009 Qt and Phonon
 تتمة الرسائل ومربعات الحوار في qt
التاريخ 04/07/2009 تتمة الرسائل ومربعات الحوار في qt
 مدخل الى xml في Qt
التاريخ 04/07/2009 مدخل الى xml في Qt
 الإدخال والإخراج لبيانات الفئات
التاريخ 04/07/2009 الإدخال والإخراج لبيانات الفئات
 

تمرير المصفوفات كوسطاء للتوابع

بسم الله الرحمن الرحيم

بعد دراستي للموضوع حبيت انقل لكم فهمي لهذا الموضوع ..والاستفادة من تعليقاتكم
طبعا الاكواد المكتوبة بالموضوع (ملطووشة)

Passing Arrays to Functions

عند تمرير مصفوفة كوسيط لأي التوابع فانة يتم تمريرها عن طريق اسمها فقط بدون اقوواس
نأخذ مثال عند المصفوفة imam1

  1. int imam1[30];


وعند تمريرها لتابع Mod
  1. Mod(imam1,30);


ياخذ المصفوفة imam1 وحجمها كوسيطين لة .

تقوم السي ++ بتمرير المصفوفات اتوماتيكيا الى التوابع بأاستخدام اسلوب التمرير بالعنوان pass-by-refrence
(حيث يمكن للتوابع المستدعاة من تغير قيم عناصر المصفوفة )
تشكل قيمة اسم المصفوفة في واقع الامر عنوان اول عنصر من عناصرها.وعلى اعتبار اننا نمرر عنوان بداية المصفوفة فأن التابع المستدعى يعلم تمام اين توجد عناصر المصفوفة في الذاكرة.وبالتالي فان اي تغير لقيمة هذي العناصر من قبل التابع المستدعى سوف يغير من القيمة الفعلية لهذة العناصر في مواقعها الاصلية لذاكرة.
اذا يمكن تمرير اي مصفوفة بأكمالها كوسطاء بالعنوان واتمرير اي عنصر بالقيمة من عناصرها مثل اي متحول عادي.
من اجل تمرير اي عنصر من عناصر المصفوفة كوسيط لتابع ,استخدم اسم المصفوفة مصحوبا بدليل العنصر عند استدعا التابع

ملاحظة:
يجب كتابة الجزء الرأسي للتابع المراد تمرير المصفوفة عن طريقة على الشكل التالي
  1. void Mod (int b[],int ArrsySize)


للدلالة على ان التابع يتوقع استقبال مصفوفةمن الاعداد الصحيحة حسب الوسيط b وهي تحتوي على ArrsySize عنصرا.
ما هو ضروري انك تكتب حجم المصفوفة .


نأخذ المثال التالي لتوضيح الفرق بين عملية تمرير مصفوفة وعنصر من عناصر المصفوفة:

  1. #include <iostream>
  2. #include <iomanip>
  3. using namespace std;
  4. void modi(int [],int);
  5. void modiElment(int );
  6. int main()
  7. {
  8. const int ArraySize=5;
  9. int a[ArraySize]={0,1,2,3,4};
  10. cout<<"The Values of the original array are:"<<endl;
  11. for (int i=0;i<ArraySize;i++)
  12. cout<<setw(3)<<a[i];
  13. cout<<endl;
  14. modi(a,ArraySize);//array a passed call-by-reference
  15. cout<<"The Values of the modi array are:"<<endl;
  16. for (int i=0;i<ArraySize;i++)
  17. cout<<setw(3)<<a[i];
  18. cout<<endl<<endl;
  19. cout<<"the value of a[3] is "<<a[3]<<endl<<endl;
  20. modiElment(a[3]);
  21. cout<<"the value of a[3] is "<<a[3]<<endl<<endl;
  22. system("pause");
  23. return 0;
  24. }
  25. void modi (int b[],int Size)
  26. {
  27. for (int j=0;j<Size;j++)
  28. b[j]*=2;
  29. }
  30. void modiElment(int e)
  31. {
  32. cout<<"Value in ModiElment is "<<(e*=2)<<endl<<endl;
  33. }



شرح الكود:
في البداية يقوم البرنامج بطباعة العناصر الخمسة الصحيحة لمصفوفة a .ثم تتم عملية تمرير المصفوفة الى التابع modi حيث يتم ضرب كل عنصر من عناصر a بالعدد 2. بعدها نعيد طباعت المصفوفة a ضمن التابع ال main . نلاحظ من خلال من الخرج انة بالفعل تم تغير قيم عناصر المصفوفة a بواسطة التابع modi .
ثم يقوم البرنامج بعد ذالك بطباعة قيمة العنصر
  1. a[3]


ثم يمررة الى التابع modiElment الذي يقوم بضرب قيمة الوسيط بالعدد2 ويقوم بطباعة القيمة الجديدة
لاحظ انة عند طباعة قيمة العنصر في التابع ال main انة لم يجري عليها تغير .لان عملية تمرير عنصر من عناصر المصفوفة تتم بالقيمة وليس بالعنوان.


احيانا نحتاج الى تمرير المصفوفة دون المساس بي قيم عناصر المصفوفة.وعلى اعتبارا ان عملية تمرير المصفوفة تتم بالعنوان فأنة من الصعب التحكم في عملية التغيير.ولتفادي ذالك نستخدم const لمنع القيام باي تغير على قيم عناصر المصفوفة المررة.
عند استخدام const من قبل اي مصفوفة معطاة كوسيط فأن عناصرها تصبح عبارة عن ثوابت ضمن جسم التابع ولا يمكن تغير قيمها
واي محاولة لتغير قيمها يؤدي الى حدوث خطاء .

نأخذ المثال التالي للتتضح الفكرة:

  1. #include <iostream>
  2. #include <iomanip>
  3. using namespace std;
  4. void TryToModi(const int []);
  5. int main()
  6. {
  7. int a[]={10,20,30};
  8. cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
  9. TryToModi(a);
  10. system("pause");
  11. return 0;
  12. }
  13. void TryToModi(const int b [])
  14. {
  15. b[0] *=2;
  16. b[1] *=2;
  17. b[2] *=2;
  18. }


الشرح:
يبين البرنامج كيفية استخدام const مع التابع TryToModi المعرف مع الوسيط const int b[]
الذي يحدد الوسيط b كوسيط ثابت لا يتغير وبعد كتابة هذا البرنامج نحصل على رسالة خطاء
بحيث لا يمكن تغير القيم الثلاث.

وهذا والله اعلم
ارجو اني وفقت في تقديم هذا الشرح.

إسم الكاتب تاريخ الإضافة التقييم / المقيمين زيارات الدرس
المستشار 20/09/2008 0 / 0 1501

الأكثر زيارة

 دليل تنصيب اطار عمل Qt ، حزمة MinGW ، بيئة التطوير QDevelop
الزيارات 4284 دليل تنصيب اطار عمل Qt ، حزمة MinGW ، بيئة التطوير QDevelop
 اعداد وتنصيب Qt
الزيارات 4071 اعداد وتنصيب Qt
 التطوير السريع للتطبيقات Rapid Application Development
الزيارات 3762 التطوير السريع للتطبيقات Rapid Application Development
 دليل تنصيب اطار عمل Qt ، حزمة MinGW ، بيئة التطوير Eclipse
الزيارات 3747 دليل تنصيب اطار عمل Qt ، حزمة MinGW ، بيئة التطوير Eclipse
 C++ In a Nutshell
الزيارات 3154 C++ In a Nutshell
 

الأكثر تصويتـا

 اعداد وتنصيب Qt
نتيجة التصويت 41 من 6 شخص اعداد وتنصيب Qt
 الدرس الاول : كتابة اول برنامج
نتيجة التصويت 41 من 6 شخص الدرس الاول : كتابة اول برنامج
 تخطيط البرامج Program Layout
نتيجة التصويت 40 من 6 شخص تخطيط البرامج Program Layout
 دوال المستوى العالي لبرمجة تطبيقات متعددة المسالك
نتيجة التصويت 30 من 3 شخص دوال المستوى العالي لبرمجة تطبيقات متعددة المسالك
 التطوير السريع للتطبيقات Rapid Application Development
نتيجة التصويت 30 من 5 شخص التطوير السريع للتطبيقات Rapid Application Development
 
 

سكربت story-script v1 برمجة bwady.com تطوير SudaNix