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

الصفحات

دروس في سي بلس بلس ++C - مدى رؤية المتغيرات Variable Scope

دروس في سي بلس بلس ++C - مدى رؤية المتغيرات Variable Scope


سي بلس بلس,تعلم سي بلس بلس,لغة السي بلس بلس,السي بلس بلس,لغة سي بلس بلس,تعلم البرمجة,بلس,تعلم سي بلس بلس خطوة بخطوة,شرح سي بلس بلس,سي,تعليم سي بلس بلس,تعلم سي بلس بلس من الصفر,تعلم c++,سي بلس بلس للمبتدئين,تعلم برمجة سي بلس بلس,تعليم سي بلس بلس c++,تعلم البرمجة سي بلس بلس,تعليم سي بلس بلس للمبتدئين,تعلم,تعليم لغة سي بلس بلس,تعلم لغة سي بلس بلس من الصفر,تعلم لغة سي بلس بلس فى 300 دقيقة,تعلم css,سي بلس,تعلم html,تعلم بايثون,تعلم جيكويري



السلام عليكم ورحمة الله وبركاتة مرحبا بكم احبتي الكرام اليوم سوف نقدم لكم الدرس الثالث من دروس في سي بلس بلاس ++C  مدى رؤية المتغيرات Variable Scope ويحتوي هذا الدرس على شرح اربع مستويات وهي : مجال الرؤية على مستوى الاقتران Function Scope وايضا على مستوى الملف البرنامج File Scope وعلى مستوى الكتلة البرمجية الخاصة Block Scope وسنتعرف ايضا على مجال الرؤية على مستوى نماذج ووسائط الاقتران الفرعي Function Prototype Scope.

تعلم لغة البرمجة c++ من الصفر إلى الاحتراف

قبل ان نباشر بدارسة الحالات الأربعة لنتعرف أولا على مفهوم المجال المتغيرات،حيث تقسم المتغيرات بحسب مدى رؤيتها إلى نوعين رئيسين وهما المتغيرات المحلية Local والمتغيرات الشاملة أو العامة Global.

المتغيرات المحلية Local 

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

int Function1(int B)
{
int X=5;
return X+B;
}
وقد صرحنا هنا عن المتغير X بالقيمة 5 داخل الاقتران Function1 وبذلك يكون المتغير X متغير محلي للاقتران Function1 ولا يمكن بأي صورة من الصور التعامل مع المتغير X من خارج الاقتران Function1 وحتى نربط مدى الرؤية بمجال تأثر المتغير نقول إن مدى رؤية المتغير X منحصرة داخل الاقتران Function1 فقط .

المتغيرات الشاملة أو العامة Global

وهو أي متغير يتم التصريح عنه خارج أي اقتران وبصورة عامة قبل الاقتران الرئيسي main وبذلك يكون المتغير متاحا للاستخدام داخل كافة الإجراءات الفرعية وداخل الاقتران الرئيسي كما في المثال:

int X=5;
int Function1();

void main()
{
++X;
cout<<

في المثال السابق لاحظ إننا صرحنا عن المتغير العام X بالقيمة 5 في بداية البرنامج،وقبل الاقتران الرئيسي main ،وبذلك يصبح مجال تأثر المتغير X داخل كامل البرنامج بصورة عامة،أي إن مدى رؤية المتغير X سيكون الملف الكامل File Scope ، وعند تنفيذ البرنامج ستحصل على قيمتين الأولى وستكون القيمة المطبوعة 6 وعند تنفيذ تعليمة الطباعة الثانية سينتقل مسار تنفيذ البرنامج من الاقتران main إلى الاقتران الفرعي Function1 وداخل الاقتران Function1 ستتم عملية التعديل على قيمة المتغير العام X وزيادتهابـ 5،ومن جديد يعود مسار التنفيذ للاقتران main حاملا معه القيمة المعدلة من خلال التعليمية return لتصبح بذلك قيمة المتغير X=11.

ماذا يقصد بمدى الرؤية المسافة القصوى

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

1- مجال الرؤية على مستوى الاقتران(Function Scope)

يكون مجال رؤية المتغيرات منحصر داخل الاقتران فقط إذا تمت عملية التصريح عن المتغيرات داخل الاقتران نفسه،وعند التصريح عن متغير جديد محلي داخل الاقتران يتم حجز المتغير بصورة مطلقة داخل مدى الاقتران ولا يمكن لأي اقتران آخر إن يشاهد هذا المتغير،وفي حالة التصريح عن متغير محلي جديد يحمل اسم متغير سبق وان صرحنا عنه على انه متغير عام Global سيقوم المترجم بإخفاء اسم المتغير العام عن الاقتران الذي يستخدم نفس اسم المتغير بصورة محلية حتى يسمح للاقتران بإسناد القيم المطلوبة دون إن يعترض عليه المترجم حسب القاعدة التي تقول إن اسم المتغير يجب إن يكون فريدا داخل البرنامج.

وهنا تتكفل عملية الإخفاء Information Hiding التي يقوم بها المترجم بمنح الاقتران مدى الرؤية الخاص به والتصريح عن المتغيرات بصورة خاصة حتى لو كانت بنفس اسم المتغيرات العامة،كما في المثال التوضيحي التالي:

int X=5;
int Function1()

void main()
{
cout<

لدينا في المثال السابق المتغير العام X بالقيمة5وهو يقع ضمن مدى الملف ولدينا المتغير X بالقيمة100 وهو يقع ضمن مدى الاقتران الفرعي()Function1 وبمجرد إن يصل المترجم إلى تعليمة التصريح عن المتغير المحلي X سيقوم وبصورة تلقائية بتنفيذ عملية Information Hiding لإخفاء المتغير العام X عن مدى الاقتران ()Function1 ،أما داخل الاقتران الرئيسي ()main فان المتغير X لا يحتاج أي عملية إخفاء وهو ضمن مدى الاقتران main لذلك عند تنفيذ البرنامج ستجد إن القيمة المطبوعة من تنفيذ تعليمة الطباعة الأولى هي X=5 أما نتيجة تنفيذ تعليمة الطباعة الثانية فهي X=100.

2- مجال الرؤية علي مستوى الملف البرنامج File Scope

نعني بكلمة الملف جميع مراحل كتابة البرنامج من البداية التي تتضمن استدعاء المكتبات الخاصة،التصريح عن المتغيرات، الاقترانات الفرعية وبعد ذلك كتلة الاقتران الرئيسي وما تحتويه من تعليمات برمجية وحلقات تكرار

وأخيرا كتل الاقترانات والإجراءات الفرعية،ويمكننا اختصار كل ما سبق بالقول الملف البرمجي للبرنامج وعندما نصرح عن متغيرات بمستواها العام والشامل Global فان مدها المطلق يكون الملف البرمجي بأكمله من أول حرف إلى آخر حرف مع مراعاة إن المترجم يقوم بعملية إخفاء وحجب المتغيرات العامة عن الاقترانات الفرعية في حالة واحدة وهي عندما تستخدم الاقترانات الفرعية نفس أسماء المتغيرات العامة، مثال توضيحي:

int X=5;
int Fun1();
int Fun2();
int Fun3();

void main()
{
cout<


صرحنا هنا عن المتغير العام X بصورته الشاملة ويحمل القيمة 5 وبذلك سيكون مداه جميع البرنامج باستثناء الاقتران الفرعي Fun1 الذي يستخدم متغيرا محلى بنفس اسم المتغير العام X ويحمل القيمة 100 لهذا السبب سيحجب المترجم المتغير العام عن مداه ويبقى المدى مفتوح على المتغير المحلى عند تنفيذ البرنامج سيبدأ تسلسل تنفذ التعليمات من الاقتران الرئيسي وتحديدا من تعليمة الطباعة الأولى والتي تستدعي الاقتران Fun1 سينتقل بعدها مسار البرنامج لتنفيذ الإجراء الفرعي Fun1 وعند تنفيذ تعليمة التصريح عن المتغير X المحلي يحجب المتغير العام X وتكون القيمة العائدة من الاقتران هي X=10 أما الاقتران Fun2 فهو يتعامل مع المتغير العام X ومن خلال تعليمة return تزداد قيمة X بواحد،لذلك ستصبح قيمة المتغير العام x=6 وعند الوصول للاقتران Fun3 ستلاحظ انه أيضا يتعامل مع المتغير العام بصورة مباشرة وعند تنفيذ تعليمة return ستصبح قيمة المتغير X الشامل 11.

3- مجال الرؤية على مستوى نماذج ووسائط الاقتران الفرعي Function Prototype Scope

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

#include<iostream.h>

int X(int v, int s);

int v=5;//متغير عام

int s=10;//متغير عام

int F=1;//متغير عام

int T=8;//متغير عام

void main()

{

cout<<v<<endl;
cout<<s<<endl;
cout<<F<<endl;
cout<<T<<endl;
cout<<X(5,7);//x استدعاء الاقترن  

}//نهاية البرنامج

int X(int F, int T)
{

return F+T;
}//نهاية الاقتران

 

مثال توضيحي : المثال السابق يوضح فكرة مجال الرؤية على مستوى وسائط الاقتران ويمكنك تمييز وسائط التمرير المستخدمة في عملية التصريح عن الاقتران الفرعي X وهي المتغير V والتغير S , والهدف من استخدام هذه المتغيرات هو تمرير القيم للاقتران الفرعي X , علما بأنه يمكننا الاستغناء بصورة قطعية عن أسماء الوسائط داخل تعليمة التصريح عن الاقتران X ولكن بشرط أن نحافظ على نوع بيانات الوسائط لتصبح عندها تعليمة التصريح كما في الشكل التالي :

int X(int ,int );

عندما يصل المترجم لتعليمة التصريح عن الاقتران X السابقة أو التعليمة المدرجة في المثال والتي تحتوي أسماء الوسائط V,S سيعمل بصورة تلقائية على حجز مواقع داخل ذاكرة المعالج بنفس عدد الوسائط ويحددها بنوع البيانات المستخدم في تعريف الوسائط , بحيث لا ترتبط تلك المواقع بأسماء الوسائط بل بترتيبها داخل عملية التصريح , وهنا سيعمل الموقع الأول القيمة المفترض تمررها أولا أي مكان الوسيط V والموقع الثاني سيحمل القيمة الممررة الثانية أي مكان الوسيط S .


داخل كتلة وجسم الاقتران عملنا على تغيير أسماء وسائط التمرير فبدل من المتغير V أصبح المتغير F وبدل المتغير S أصبح المتغير T , تعامل الوسائط داخل جسم الاقتران على أنها وسائط استقبال تحمل القيم المرسلة داخل تعليمة الاستدعاء . هنا وعلى الرغم من اختلاف الأسماء . إلا أنها ستعود لنفس المواقع المحجوزة مسبقا في الذاكرة بحيث يستقبل الوسيط F قيمة الموقع الأول ويستقبل الوسيط T قيمة الموقع الثاني .


ملاحظة : لا يمكن الاستغناء عن أسماء الوسائط داخل كتلة الاقتران كما في عملية التصريح وذلك يتمكن المبرمج من التعامل معها بأسمائها بدلا من التوجه لمواقع الذاكرة كما في لغة الاسمبلي وتعقيداتها .


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


وعند تنفيذ البرنامج ستجد أن تعليمة الطباعة الأولى ستتعامل مع المتغير العام v الذي يحمل القيمة 5 وتعليمة الطباعة الثانية ستتعامل مع المتغير العام s الذي يحمل القيمة 10 وكذلك تعليمات الطباعة الثالثة والرابعة فإنها ستتعامل مع المتغيرات العامة F=1 و المتغير T=8 , وبذلك تتجاهل التعليمات الأربعة أسماء وسائط التمرير التي ينحصر مدى رؤيتها داخل الاقتران x .


تعليمة الطباعة الخامسة تحتوي عملية استدعاء للاقتران X بتمرير القيم 7.5 على التوالي أي أن الموقع الأول المحجوز بالذاكرة سيحمل القيمة 5 ويحمل الموقع الثاني القيمة 7 . من شان عملية الاستدعاء الاقتران X أن تنتقل بمسار تنفيذ البرنامج إلى الاقتران الفرعي X , وعندها سيعمل المترجم على تحميل المتغير F بقيمة الموقع الأول والمتغير T بقيمة الموقع الثاني .


داخل جسم الاقتران ستعمل تعليمة الإرجاع return على تنفيذ عملية الجمع بين المتغير T والمتغير F ومن ثم إرجاع الناتج ليحل مكان اسم الاقتران X في تعليمة الاستدعاء وبذلك يكوون نتيجة تنفيذ تعليمة الطباعة الخامسة طباعة القيمة 12 .


تلاحظ مما سبق أن الاقتران الفرعي X تجاهل المتغيرات العامة مع أنها تحمل نفس أسماء الوسائط واكتفى بتنفيذ تعليماته البرمجية على الوسائط التابعة له بصورة مستقلة لنقوم الآن بإجراء تغيير بسيط على كتلة الاقتران x ونزيل أسماء الوسائط F و T كما في الشكل التالي :

int X(int ,int)
{

return F+T;

}//نهاية الاقتران

ماذا تتوقع هل من أخطاء برمجية اما أن المترجم سيعترض على خطوتنا السابقة ؟

الإجابة: قم بتنفيذ البرامج بعد التعديل ستجد انه لا يوجد أي خطا ولا يوجد أي اعتراض من المترجم إذ أصبح الاقتران X يتعامل بصورة مباشرة مع المتغيرات العامة F و T بدلا من وسائط التمرير F و T وبما أن المتغيرات العامة يكون مداها كامل البرنامج بما يحتويه من إجراءات فرعية فلا يوجد أي خطا في التعديل السابق وستكون نتيجة تعليمة الطباعة الخامسة استدعاء الاقتران X بالوسائط 5.7


التي سيتم تخزينها داخل المواقع الذاكرة وسينتقل مسار تنفيذ البرنامج للاقتران X حتى نصل تعليمة الإرجاع return التي تتضمن عملية جمع بين المتغير العام F والمتغير العام T وبذلك تكون القيمة العائدة 1+8=9.


لكن لنفترض أن البرنامج السابق لا يحتوي على المتغيرات العامة F و T وأننا قمنا بإجراء التعديل السابق عندها وقعنا في خطا برمجي سيعترض عليه المترجم بالرسالة التالية :

error C2065:'F':undeclared identifier
error C2065:'T':undeclared identifier

أي أن المتغيرات المستخدمة في تعليمة الإرجـاع T و F غير معرفة ولا يمكن التعامل معها نلخّص في نهاية الدرس فكرة مجالات الرؤيا وهي أن المتغيرات المصرح عنها دخل أي برنامج تخضع لمجال ومدى رؤيا محدد بحسب مكان التصريح عن المتغير فإذا كان مكان التصريح في بداية البرنامج وخارج أي كتلة برمجية عندها تسمى هذه المتغيرات بمتغيرات عامة فيكون مدى رؤيتها كافة قطاعات البرنامج طالما أنها لن تحجب بسبب وجود متغير محلي وإذا كان مكان التصريح داخل كتلة برمجية خاصة فعندها ينحصر مجال الرؤيا داخل تلك الكتلة اما وسائط الاقتران الفرعية فهي حالة خاصة تعامل على أنها متغيرات محلية مرتبطة بمدى ودورة حياة الاقتران الفرعي.

4- مجال الرؤيا على مستوى الكتلة البرمجية الخاصة Block Scope

تعرف الكتلة البرمجية الخاصة على أنها سلسلة من التعليمات البرمجية المكتوبة بلغة C++ والتي تنحصر بين قوسين البداية { والنهاية } ويطلق عليها اسم التعليمة المركبة وقد تكون هذه التعليمة تابعة لجملة الشرط  if أو جمل التحكم مثلwhile do-whil switch كما أنها قد تكون كتلة برمجية مستقلة وغير تابعة لأي جملة تحكم تكتب داخل الاقتران الرئيسي main بهدف تنسيق النص البرمجي وتقسيمه لأجزاء صغيرة أو أنها تعليمة تحكم برمجي خطية تقع ضمن سطر واحد مثل جملة التكرار  for إذ يمكننا كتابة حلقة تكرار متكاملة في أركانها الأساسية ضمن سطر واحد

وعند التصريح عن متغير جديد داخل أي كتلة برمجية فان مدى رؤية ذلك المتغير يكون محصور داخل الكتلة ولا يمكن إن نستخدم المتغير خارج الكتلة بأي حال من الأحوال طالما إننا لا نتعامل مع العنونة غير المباشرة  Reference  أو المؤشرات  Pointers  والتي سنتعرف عليها في الدروس اللاحقة.

في الأمثلة التالية سنعالج بعض الحالات والمفاهيم الجديدة المتعلقة بالكتلة البرمجية الخاصة وفي مثالنا الأول سنصرح عن المتغير B من النوع عدد صحيح int داخل حلقة التحكم while والتي تعتبر كتلة برمجية خاصة ثم سنحاول استخدام نفس المتغير بتعليمة طباعة cout خارج مدى حلقة التكرار wh

#include<iostream.h>
void main()
{//بداية البرنامج

int X=10;
int Y=1;
while(Y<=X)
{//بداية حلقة التكرار

int B=8;//المتغير المحلي
++y;
}//نهاية حلقة التكرار
cout<<B;
}//نهاية البرنامج


كما لوحظ في البرنامج السابق فان عملية التصريح عن المتغير B تمت داخل كتلة حلقة التكرار وبذلك سيكون مجال رؤية وتأثر المتغير B مغلقا داخل نفس الحلقة, وعند تنفيذ البرنامج سيعرض مترجم C++ على تعليمة الطباعة كونها تتعامل مع المتغير B ورسالة الاعتراض ستكون على النحو التالي: error C2065: "B" : undeclared identifier


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

كيف يكون المتغير B غير معرف للمترجم علما بأنه تم التصريح عنه ودعمه بالقيمة 8 قبل تعليمة الطباعة ؟ 

الجواب: على هذا التساؤل بسيط حيث إن علمية التصريح وإسناد القيمة للمتغير تمت داخل كتلة خاصة وبذلك حصرنا مجال التعامل مع المتغير داخل الكتلة البرمجية الخاصة, وإذا أردت تنفيذ تعليمة الطباعة بصورة صحيحة فعليك إن تدخلها داخل مجال الكتلة الخاصة " حلقة" while أو إن تعرف المتغير B على انه متغير عام أو شامل Global

مثال2: سنصرح في مثالنا هذا عن المتغير B مرتين, في المرة الأولى على المستوى العام ليكون مجاله كامل نطاق البرنامج وفي المرة الثانية داخل كتلة برمجية خاصة لنرى ما الذي سيحدث عند التعامل معه في الحالتين:

#include<iostream.h>

int B=8;//Bالمتغير العام

void main()

{//بداية البرنامج

for(int i=1;i<=5;i++)
{//بداية حلقة التكرار

int B=2;//المتغير المحلي
cout<<B<<endl;
}//نهاية حلقة التكرار

cout<<B;
}//نهاية البرنامج


كما تلاحظ,يوجد لدينا متغيرين يحملان نفس الاسم الأول معرف في بداية البرنامج وخارج الاقتران الرئيسي main ويحمل القيمة 8 أما الثاني فهو معرف داخل كتلة التكرار for ويحمل القيمة 2 وعند تنفيذ البرنامج ستجد ن تعليمة الطباعة الأولى والتي تقع ضمن مجال حلقة التكرار ستقوم بطباعة القيمة 21 مكررة بعدد مرات تنفيذ حلقة التكرار ولن تتغير القيمة العائدة للمتغير المحلي B=2


أما تعليمة الطباعة الثانية والتي تقع خارج مجال حلقة التكرار فستطبع القيمة 8 العائدة للمتغير B العام ويفسر ما سبق بان المتغير العام B=8 حجب عن الكتلة البرمجية الخاصة " حلقة" for كونها تحتوي تصريح عن متغير محلي بنفس الاسم B=2 ولذلك تستطيع حلقة التكرار التعامل مع المتغير العام B=8 أما تعليمة الطباعة القانية فهي خارج الكتلة الخاصة لحلقة التكرار وسنتعامل بصورة مباشرة مع المتغير العام B=8


مثال3 : لنتعرف في المثال التالي على أسلوب جديد إلا وهو فريق تسد الذي يستخدم في تقسيم البرنامج لعدة كتل خاصة عبر تابعة لأي جملة تحكم أو حلقة تكرار أو اقتران فرعي.
#include<iostream.h>

int x=1;//متغير عام

void main()
{//بداية البرنامج

{//بداية كتلة خاصة 1

int x=10;
cout<<x<<endl;
}//نهاية الكتلة الخاصة 1

{//بداية كتلة خاصة2

int x=5;
cout<<x<<endl;
}//نهاية الكتلة الخاصة 2

cout<<x;
}//نهاية البرنامج

البرنامج السابق يوضح فكرة تقسيم البرنامج لعدة كتلة برمجية خاصة مستقلة وهنا تجدر الإشارة إلى إن هذا الأسلوب يشبه لحد كبير فكرة الإجراءات الفرعية والهدف منه هو تنسيق البرنامج وسهولة السيطرة عليه فبدل من إن يكون البرنامج كتلة برمجية واحدة يمكنك تقسيمه لعدة كتلة بما يعرف بمبدأ فرق تسد Divide and Conquer والفائدة من هذا الأسلوب هي إمكانية التعديل على كتلة برمجية صغيرة بدلا من محاولة التعديل على البرنامج بأكمله. ولكن عليك الانتباه هنا إلى مدى رؤية المتغيرات ومعرفة مجال كل كتغير فكل ما ينطبق على مجال الرؤيا داخل الإجراءات الفرعية ينطبق على الكتلة البرمجية الخاصة وستلاحظ عند تنفيذ البرنامج السابق إن المتغير X معرف على ثلاثة مستويات وهي:
  • على المستوى العام.
  • على مستوى الكتلة الخاصة الأولى X=10.
  • على مستوى الكتلة الخاصة الثانية X=5.
أما تعليمات الطباعة فستخرج لنا القيم التي تقع ضمن الكتلة الخاصة الأولى القيمة 10 وتعليمة الطباعة الثانية التي تقع ضمن الكتلة الخاصة ستطبع القيمة 5, علما بان المتغير العام X=1 ثم حجبه عن المتلى الخاصة كونها تحتوي نفي اسم المتغير وأخيرا ستطبع تعليمة الطباعة الثالثة والتي لا تقع ضمن أي كتلة برمجية خاصة القيمة 1 العائدة للمتغير العام X=1


مثال 4: ادرس المثال التالي وحاول معرفة أي المغيرات يعامل على انه محلي وأيها يعامل على أنه متغير عام وهل يوجد أي خطا في البرنامج؟

#include<iostream.h>

int X=5;

void main()

{

while(X<6)
{

int X=1;
++X;
cout<<X<<endl;
}

}
عند تنفيذ البرنامج ستجد إننا وقعنا في خطا برمجي من شانه إن يدخل البرنامج في حلقة تكرار غير منهية والسبب في ذلك يعود لعدم التميز بين المتغير العام والمتغير المحلي, فبعد إن عرفنا المتغير X=5 على صورة متغير عام في بداية البرنامج استخدمناه كشرط توقف لحلقة التكرار while ثم صرحنا داخل حلقة التكرار عن متغير جديد محلي بنفس الاسم ولكن بقيمة مختلفة X=1 ثم عملنا على زيادة قيمة X بواحد داخل حلقة التكرار على أمل إن تصل القيمة لـ 6 وتنتهي بذلك الحلقة

والسبب في هذا الخطأ أم المغير المستخدم كشرط للحلقة هو المتغير العام X=5 أما المتغير الذي تجرب عليه عملية الزيادة فهو المغير المحلي الذي يقع في مجال الكتلة الخاصة التابعة لحلقة while وكون إن المتغير العام والمتغير المحلي يحملان نفس الاسم فمن المؤكد انه سيتم حجب المتغير العام عن كتلة الحلقة وعن عملية الزيادة, أما داخل تعليمة شرط توقف الحلقة التي لا تقع ضمن كتلة حلقة التكرار فالمتغير هنا المتغير العام ولن تجرب عليه أي عملية زيادة ولذلك سيستمر البرنامج في تكرار تعليمة الطباعة إلى ما لا نهاية.

ملاحظة: نؤكد على ضرورة إتقان مجالات الرؤيا حتى لا تقع في أخطاء برمجية من الصعب اكتشافها أو حتى حلها.




 وفي الختام : نشكركم على مروركم الكريم زوار و متابعين موقع الاندرويد تيك التقنية ونتمنى ان نكون قد وفقنا في هذا المقال لمافية من اجر وفائدة للجميع,كما نرحب بعودتكم مرة اخرى لموقعنا ومتابعة كل جديد او يمكنكم متابعتنا والانضمام الى القناة الخاصة بلموقع على التلجرام من هنا.

تعليقات

التنقل السريع