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

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

بدأه almstshar2 في 8 أغسطس 2008 · 4 رد · 1,529 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

طبعا الاكواد المكتوبة بالموضوع (ملطووشة)

Passing Arrays to Functions

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

نأخذ مثال عند المصفوفة imam1

int imam1[30];

وعند تمريرها لتابع Mod

Mod(imam1,30);

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

تقوم السي ++ بتمرير المصفوفات اتوماتيكيا الى التوابع بأاستخدام اسلوب التمرير بالعنوان call-by-refrence

(حيث يمكن للتوابع المستدعاة من تغير قيم عناصر المصفوفة )

تشكل قيمة اسم المصفوفة في واقع الامر عنوان اول عنصر من عناصرها.وعلى اعتبار اننا نمرر عنوان بداية المصفوفة فأن التابع المستدعى يعلم تمام اين توجد عناصر المصفوفة في الذاكرة.وبالتالي فان اي تغير لقيمة هذي العناصر من قبل التابع المستدعى سوف يغير من القيمة الفعلية لهذة العناصر في مواقعها الاصلية لذاكرة.

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

من اجل تمرير اي عنصر من عناصر المصفوفة كوسيط لتابع ,استخدم اسم المصفوفة مصحوبا بدليل العنصر عند استدعا التابع

ملاحظة:

يجب كتابة الجزء الرأسي للتابع المراد تمرير المصفوفة عن طريقة على الشكل التالي

void Mod (int b[],int ArrsySize)

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

ما هو ضروري انك تكتب حجم المصفوفة .

_____________________________________________

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

 

#include <iostream>
#include <iomanip>
using namespace std;

void modi(int [],int);
void modiElment(int );


int main()
{
 const int ArraySize=5;
 int a[ArraySize]={0,1,2,3,4};

 cout<<"The Values of the original array are:"<<endl;

 for (int i=0;i<ArraySize;i++)
  cout<<setw(3)<<a;
 cout<<endl;

 modi(a,ArraySize);//array a passed call-by-reference

 cout<<"The Values of the modi array are:"<<endl;
 for (int i=0;i<ArraySize;i++)
  cout<<setw(3)<<a;
 cout<<endl<<endl;

 cout<<"the value of a[3] is "<<a[3]<<endl<<endl;

 modiElment(a[3]);

 cout<<"the value of a[3] is "<<a[3]<<endl<<endl;
 system("pause");
 return 0;
}

void modi (int b[],int Size)
{
 for (int j=0;j<Size;j++)
  b[j]*=2;
}
void modiElment(int e)
{
 cout<<"Value in ModiElment is "<<(e*=2)<<endl<<endl;
}

شرح الكود:

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

ثم يقوم البرنامج بعد ذالك بطباعة قيمة العنصر

a[3]

ثم يمررة الى التابع modiElment الذي يقوم بضرب قيمة الوسيط بالعدد2 ويقوم بطباعة القيمة الجديدة

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

_____________________________________________________

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

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

واي محاولة لتغير قيمها يؤدي الى حدوث خطاء .

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

 

#include <iostream>
#include <iomanip>
using namespace std;

void TryToModi(const int []);
int  main()
{

int a[]={10,20,30};

cout<<a[0]<<"  "<<a[1]<<"   "<<a[2]<<endl;
TryToModi(a);
system("pause");
return 0;
}
void TryToModi(const int b [])
{
 b[0] *=2;
 b[1] *=2;
 b[2] *=2;
}

الشرح:

يبين البرنامج كيفية استخدام const مع التابع TryToModi المعرف مع الوسيط const int b[]

الذي يحدد الوسيط b كوسيط ثابت لا يتغير وبعد كتابة هذا البرنامج نحصل على رسالة خطاء

بحيث لا يمكن تغير القيم الثلاث.

وهذا والله اعلم

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

تم تعديل هذه المشاركة بواسطة almstshar2 في 8 أغسطس 2008 في 17:05

#2
اقتباس
طبعا الاكواد المكتوبة بالموضوع (ملطووشة)

مو مهم , المهم انك فاهم الي قاعد تكتبه .

بالنسبة لشرحك , رائع ومسترسل في ادق التفاصيل .

عندما تصل إلى فصل المؤشرات ستتعلم طريقة اخرى في تمرير المصفوفات إلى التوابع .

بداية موفقه .

تحياتي . . . :blush:

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#3

وبما اني مصفوفة (لكن ما انفع اكون وسيط)

يسرني ان ابدي إعجابي في الموضوع :D

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

مدونة دوال

كيوتي العربي

#4

هلا والله اخوواني

اشكركم على التشجيع الراائع والذي يعني لي الكثيير

#5

مشاء الله عليك, لبد من ان كتابة هذا الموضوع اخذت وقت طويل منك .... يعطيك العافية و موفق :happy:

من الجميل أن تذكر اسباب وجوب تمرير المصفوفه بأسلوب by reference وليس by value .. ان لم تكن تعرف السبب فبحث عنه و اكيد ستجده :wink:

تم تعديل هذه المشاركة بواسطة اللؤْلؤة رغَـــد في 13 أغسطس 2008 في 07:25 — السبب: ما دخلك بشؤون الإشراف لو سمحت

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

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