المتغيرات وفئات التخزين في ++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 .
ألي | استاتيكي ألي | خارجي | |
نطاق الرؤية | الدالة | الدالة | الملف |
المدي الزمني | الدالة | البرنامج | البرنامج |
الاستهلاك التلقائي | اعتباطي | صفر | صفر |
التخزين | شريحة المكدس | شريحة البيانات | شريحة البيانات |
الغرض | لدالة معينة | كالسابق , مع الاحتفاظ بقيم المتغير | لعدد من الدوال |
تعليقات
إرسال تعليق