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