المتغيرات وفئات التخزين في ++C

المتغيرات وفئات التخزين

سوف نعرض الأن لموضوع يتعلق بالعلاقة بين المتغيرات والدوال , ألا وهو موضوع فئات التخزين storage classes وهي تتعلق بنطاق رؤية المتغيرات المخزنة بالنسبة لدوال البرنامج , والعمر الزمني لها .

وسوف نعرض لثلاثة أنواع من هذه الفئات : المتغيرات الألية automatic variables والخارجية external , والإمكانية static .

المتغيرات الألية (المحلية )

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

ويطلق علي الفترة ما بين إنشاء المتغير وإزالته المدي العمري life time أو duration , وكما تري ينطبق بالنسبة للمتغيرات الألية مع فترة تنفيذ دوالها .

نطاق الرؤية

يطلق مصطلح نطاق الرؤية visibility علي إمكانية التعامل مع المتغير من قبل الدوال المختلفة للبرنامج ] أي من دوال تري المتغير [ فالمتغيرات الألية ليست مرئية إلا للدوال التي هي معرفة بها . ] ومن ثم فيمكن أن تكرر أسماء المتغيرات في دوال مختلفة مثلا , المتغير j يكرر كمتغير حاكم متحم في الدوارات في الدوال المختلفة , ولكن لا يجب أن يكرر داخل نفس الدالة , بالضبط كما تستخدم نفس الأسماء في الأسر المختلفة , ولكن لا يجب أن يكرر نفس الاسم داخل نفس الأسرة [

ويطلق علي المتغيرات الألية أيضا المحلية local حيث يتطابق مداها الزمني ونطاق رؤيتها مع الدالة المعرفة بها .

المتغيرات الخارجية

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

extern.cpp


 


// extern.cpp


// demonstrates external variables


#include <iostream.h>


#include <conio.h>        // for getch()


 


char ch = 'a';            // exteral variable ch


 


void getachar();          // function declarations


void putachar();


 


void main()


   {


   while( ch != '\r' )    // main() accesses ch


      {


      getachar();


      putachar();


      }


   getche();


   }


 


void getachar()           // getachar() accesses ch


   {


   ch = getch();


   }


 


void putachar()           // putachar() accesses ch


   {


   cout << ch;


   }




وفي هذا المثال تم تعريف المتغير ch متغيرا خارجيا , فأمكن للدوال الثلاث أن تتعامل معه . وأحد هذه الدوال تستخدم الدالة المكتبية getch() وهي تماثل الدالة getch() عدا أنها لا تظهر الحرف المخل ,] الحرف e المميز بين الدالتين هو اختصار لكلمة echo ومعناها رجع الصدي بمعني أن إحدي الدالتين تردد الحرف المدخل بإظهاره علي الشاشة , والثانية لا [



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



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



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



المتغيرات الإستاتيكية



نعرض هنا للمتغيرات الإستاتيكية الآلية , أما النوع الاستاتيكي الخارجي فلا تطبيق له إلا في البرامج متعددة الملفات , وهو ما لن نتعرض له إلا في الفصل الخامس عشر .



والمتغير الاستاتيكي الآلي له نطاق رؤية المتغير الآلي , و المدي الزمني للمتغير الاستاتيكي . ويستخدم هذا النوع من المتغيرات حينما يراد أن تتذكر الدالة قيما طوال عمل البرنامج , وإليك مثال يوضح الفكرة , وفيه تقوم الدالة getavge() بحساب المتغير الجاري , أي كلما أدخل عدد قسم مجموع الأعداد المدخلة علي عدد مرات للإدخال .






extern.cpp


 


// extern.cpp


// demonstrates external variables


#include <iostream.h>


#include <conio.h>        // for getch()


 


char ch = 'a';            // exteral variable ch


 


void getachar();          // function declarations


void putachar();


 


void main()


   {


   while( ch != '\r' )    // main() accesses ch


      {


      getachar();


      putachar();


      }


   getche();


   }


 


void getachar()           // getachar() accesses ch


   {


   ch = getch();


   }


 


void putachar()           // putachar() accesses ch


   {


   cout << ch;


   }




فالمتغيران total, count يحتفظان بقيمهما بعد انتهاء عمل الدالة الخاصة بهما , بحيث إذا أعيد استدعاؤها , فإنها تعاد بنفس القيم السابقة للمتغيرين .



ملخص فئات التخزين



الجدول الأتي يلخص فئات التخزين , وفيه نذكر لمن لديهم فكرة عن معمار الحاسبات التي تعمل بنظام الدوس أن التخزين للمتغيرات الآلية يكون في شريحة المكدس stack segment بينما تخزن المتغيرات الخارجية و الإستاتيكية في شريحة البيانات data segment .



































































ألي



استاتيكي ألي



خارجي



نطاق الرؤية



الدالة



الدالة



الملف



المدي الزمني



الدالة



البرنامج



البرنامج



الاستهلاك التلقائي



اعتباطي



صفر



صفر



التخزين



شريحة المكدس



شريحة البيانات



شريحة البيانات



الغرض



لدالة معينة



كالسابق , مع الاحتفاظ بقيم المتغير



لعدد من الدوال




التسميات: