- الرئسية
- اتصل بنا
- اخبار خفيفة
- جديد المواقع
- العاب الفيديو
- تعليم برمجة
- موبايلات
- ستلايت
- خدع ومهارات
- جديد البرامج
- اشهار مواقع
دروس في ++C - مجال الرؤية على مستوى نماذج ووسائط الاقتران الفرعي Function Prototype Scope
2007-09-26تعتبر جميع المتحولات والمتغيرات المستخدمة كوسائط تمرير داخل الاقتران الفرعي و متغيرات خاصة تقع تحت مجال رؤية الاقتران فقط , كما أنها تعتبر متغيرات وهمية يستبدلها المترجم بمواقع محددة داخل الذاكرة . وعند استدعاء الاقتران الفرعي يتعامل المترجم مع القيم الموجودة داخل مواقع الذاكرة بصورة مباشرة متجاهل أسماء الوسائط .كما أن دورة حياة وسائط التمرير هذه قصيرة جدا , إذ أنها لا تتعدى فترة تنفيذ الاقتران الفرعي لتعدم بصورة تلقائية بعد ذلك.وهنا يمكننا التصريح عن متغيرات ذات مجال عام تحمل نفس أسماء وسائط التمرير الخاصة باقتران معين دون الوقوع بأخطاء برمجية أو حدوث حالة من اللبس يصعب على المترجم تفسيرها , وستعامل المتغيرات العامة بصورة مستقلة عن وسائط التمرير كما في المثال الأتي .
#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 غير معرفة ولا يمكن التعامل معها . نلخّص في نهاية الدرس فكرة مجالات الرؤيا وهي أن المتغيرات المصرح عنها دخل أي برنامج تخضع لمجال ومدى رؤيا محدد بحسب مكان التصريح عن المتغير فإذا كان مكان التصريح في بداية البرنامج وخارج أي كتلة برمجية عندها تسمى هذه المتغيرات بمتغيرات عامة فيكون مدى رؤيتها كافة قطاعات البرنامج طالما أنها لن تحجب بسبب وجود متغير محلي وإذا كان مكان التصريح داخل كتلة برمجية خاصة فعندها ينحصر مجال الرؤيا داخل تلك الكتلة اما وسائط الاقتران الفرعية فهي حالة خاصة تعامل على أنها متغيرات محلية مرتبطة بمدى ودورة حياة الاقتران الفرعي .



