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

الصفحات

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

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

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

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

  1. مجال الرؤية على مستوى الاقتران Function Scope
  2. مجال الرؤية على مستوى الملف البرنامج File Scope
  3. مجال الرؤية على مستوى الكتلة البرمجية الخاصة Block Scope
  4. مجال الرؤية على مستوى نماذج ووسائط الاقتران الفرعي Function Prototype Scope

وقبل إن نباشر بدارسة الحالات الأربعة لنتعرف أولا على المفهوم العام لمجال المتغيرات،حيث تقسم المتغيرات بحسب مدى رؤيتها إلى نوعين رئيسين وهما المتغيرات المحلية 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

مجال الرؤية على مستوى الاقتران(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

مجال الرؤية علي مستوى الملف البرنامج 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.

تعليقات

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