 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:
|
|
17-06-2015, 02:03 AM
المشاركة 7
|
|
الفصل الأول نظرة عامة على لغة السى وبناء (هيكل) البرنامج C Overview and Program Struc
الفصل الأول نظرة عامة على لغة السى وبناء (هيكل) البرنامج C Overview and Program Structure:
"كود المصدر" للغة السى C Source Code :
فيما يلى ما يبدو عليه "كود المصدر" للغة السى :
كود:
/* Chapter one sample C program for
The CCS C compiler */
#include <My_PIC.H>
void main (void) {
int i ;
for( i=1; i<=10; i=i+1 ) {
output_high(PIN_C6); //Turn green LED on .
delay_ms(500);
output_low(PIN_C6); //Turn green LED off .
delay_ms(500);
}
}

هذا البرنامج قد يبدو مبهما جدا بالنسبة لك الآن . عند الانتهاء من قراءة هذا الكتاب والقيام بعمل التجارب ، فإن هذا البرنامج بل والبرامج الأكثر تعقيدا سوف لن تبدو مبهمة على الإطلاق . كلما قرأت الفصول القليلة القادمة ، يمكنك الرجوع إلى هذا البرنامج للتعرف على كيفية ربط الموضوعات لهذا البرنامج . الآن ، دعونا نرصد بعض الملاحظات حول المظهر العام للبرنامج .
التعليقات Comments :
تساعد التعليقات أى شخص (بما فيهم المبرمج نفسه) يقراء الكود الخاص بك على أن يفهم ما يقوم به البرنامج . هناك نوعان من أساليب التعليق :
الإسلوب الأول : “/* put your comments here */” ، يمكن أن تمتد التعليقات لعدة أسطر ، لكنها لا تكون متداخلة.
الإسلوب الثانى : “//put your comments here…… end of line” ، يمكن أن يمتد التعليق على سطر واحد فقط .
يتجاهل المترجم جميع التعليقات . يمكن أن يتم استخدم كل من الإسلوبين فى نفس البرنامج .
بناء (هيكل) البرنامج Program Structure :
تتكون برامج لغة السى من :
1- توجيهات ما قبل معالج لغة السى C Preprocessor Directives
الميزة الجديرة بالاهتمام فى لغة السى هى أن لديها ما يسمى توجيهات "قبل المعالج" preprocessor ويمكن تسميتها اختصارا توجيهات المعالج ، وهى جزء لا يتجزأ من برنامج الترجمة . يمكنك التفكير فى توجيهات المعالج باعتبارها أداة برمجية ، والتى تمر خلال الكود أولا (قبل الترجمة) وتقوم بعمل بعض التعديلات على ما يتم ترجمته فى الواقع .
يبدأ توجيه المعالج بالرمز "هاش" “#” ويحتل السطر بكامله . وسوف يتم تغطيتها لاحقا بالتفصيل فى الفصل الثالث .
فى المثال أعلاه ، يبدأ البرنامج بتوجيه التضمين (#include) ، وهو أمر (توجيه) للمعالج بالقيام بوضع (تضمين) جميع السطور التى يحتوى عليها الملف (e3.h) لكى تظهر فى هذا المكان ضمن الكود عند بدء الترجمة الفعلية .
على سبيل المثال ، إذا قمت بإنشاء ملف يسمة delay.inc ووضعت فى هذا الملف السطر الوحيد التالى :
عندئذ يمكنك استبدال سطرى التأخير delay_ms(500); فى البرنامج أعلاه بالتوجيه #include <delay.inc> ، وسوف يقوم البرنامج بالترجمة الصحيحة تماما . ففى الخطوة الأولى للترجمة ، يقوم معالج المترجم بقراءة البرنامج وعندما يصل إلى كل سطر مكتوب فيه التوجيه #include<delay.inc> يقوم بقراءة الملف المذكور وهو delay.inc واستبدال #include بالعبارة delay_ms(500); ، وهى السطر الوحيد داخل الملف ، حيث مكان التوجيه #include تماما .
يمكن أن يكون المعالج ميزة قوية فى لغة السى والتى تزيد من قابلية (سهولة) القراءة للبرنامج ، وتعظيم تقنية إعادة استخدام الكود ، وتساعد بشكل كبير على المحافظة على البرنامج .
إذا تفحصت نموذج البرنامج المبين أعلاه ، سوف ترى أن السطر الأول هو توجيه للمعالج لتضمين الملف My_PIC.H. من الشائع جدا (بل قد يجب) أن يكون أول سطر أوامر (وليس تعليقات) فى البرنامج هو توجيه بتضمين ملف به تعريفات محددة للهاردوير الخاص بالميكروكونترولر المستخدم . كثيرا ما يستخدم الامتداد (.h) (اختصار لكلمة header) لهذا النوع من الملفات . فى حالتنا ، جميع الإعلانات (التعريفات) اللازمة للميكروكونترولر المستخدم سوف تكون موجودة فى ملف الرأس المسمى My_PIC.H .
2- الدوال Functions:
الدالة هى مجموعة من التعليمات البرمجية القابلة للاستدعاء ، والتى تعرف فى بعض اللغات الأخرى بالاجراء أو بالبرنامج الفرعى . تتكون الدوال من بيانات محلية ، بمعنى أنه يمكن الوصول إليها فقط للدالة وللعبارات الموجودة ضمن هذه الدالة .
فى البرنامج أعلاه ، نجد أن السطر التالى يحتوى على تعريف لدالة تسمى الدالة الرئيسية main . جميع البرامج يجب أن يكون لديها دالة واحدة فقط تسمى الدالة الرئيسية main() . هذه الدالة هى المكان الذى يبدأ من عنده تنفيذ البرنامج . عند الإشارة إلى اسم دالة ، فإنه يكون متبوعا بالقوسين () ، حتى يكون من الواضح أن هذا اسم لدالة .
كلمة void (بمعنى فارغ أو خاوى) ، الموجودة قبل اسم الدالة تشير إلى أن هذه الدالة لا تعيد (تعطى) شىء نتيجة لتنفيذها ، وكلمة void الموجودة بين القوسين (void) تشير إلى أن هذه الدالة لا تأخذ شىء من القائم بالاستدعاء . القوسين {…} هى رموز لاحتواء مجموعة بينها . جميع الدوال تبدأ وتنتهى بهذه الرموز .
سوف يتم تناول الدوال بالتفصيل فى الفصل السابع ، ومع ذلك ، لوضع أساس لما تكون عليه الدوال ، إليك بعض الأمثلة على استخدام الدوال :
كود:
x=sin(y); //sin is a function with one argument and a return value
الدالة المسماة sin هى دالة بدليل أو وسيط أو بارامتر واحد ، وتعود بقيمة نتيجة لتنفيذها .
كود:
x=sin(y*3.1415/180); //the argument may be any expression
الوسيط قد يكون تعبير .
كود:
x=180*sin(y)/3.1415;// the return value may be used in an expression.
يمكن استخدام قيمة العودة فى تعبير.
3- الإعلانات Declarations :
السطر “int i" هى إعلان (تعريف) بيانات لمتغير يسمى بالمعرف “i" ، و “int” تشير إلى أن هذا المتغير هو عدد صحيح integer . فى هذه الحالة فإن المتغير “i" لا يجوز استخدامه إلا داخل الدالة الرئيسية main . إذا كان هذا السطر فوق (قبل) بداية الدالة الرئيسية (خارج الدالة الرئيسية) ، عندئذ ، يمكن الوصول إلى المتغير “i" بواسطة الدوال الأخرى . النطاق الذى يمكن الوصول خلاله إلى المتغير يسمى "نطاق المتغير" variable scope . سوف يتم تغطية النطاق بمزيد من التفصيل فى الفصل الرابع .
4- العبارات Statements والتعبيرات Expressions :
سطر “for” هو عبارة statement . يتم تنفيذ العبارات فى وقت الشغيل . هذه العبارة بشكل خاص تتضمن ثلاث تعبيرات expressions هى i=1; i<=10; i=i+1 يفصل بين التعبير والآخر الفاصلة المنقوطة “;” . سوف يتم تغطية التعبيلاات فى الفصل الخامس ، وتغطية العبارات فى الفصل السادس .
لمحة سريعة على عبارة “for” :

يتم تنفيذ التعبير الأول “i=1” لمرة واحدة . بعد ذلك يتم تكرار ما يلى :
• اختبار التعبير الثانى “i<=10” ، والخروج من الحلقة فى حالة ما إذا لم يكون صواب false .
• تنفيذ العبارة التى تلى القوس “)” .
• يتم تنفيذ التعبير الثالث “i=i+1” .
فى هذا المثال يتم تنفيذ الأربعة أسطر لعشر مرات ، حيث يذهب المتغير “i" من القيم 1 إلى القيمة 10 ، وبعد ذلك ، عندما تكون قيمته 11 ، تتوقف الحلقة لأن التعبير “11<=10” يكون غير صواب .
التعبيرات expressions هى مزيج من الثوابت ، والمتغيرات ، والعوامل ، واستدعاء الدوال . التعبيرات دائما يكون لها قيمة ناتج . من أمثلة العوامل “+ , - , * , / “ والعمل الخاص جدا “=” .
فى حالتنا ، حيث أن لدينا أربعة عبارات للتنفيذ فى عبارة “for” فإننا نحتاج لضمها (تجميعها) معا بالأقواس المعرجة {…} . هذه العبارة تسمى عبارة مركبة . وقد لا تحتوى الأقواس على أى عبارات أو قد تحتوى على المزيد من العبارات . بدون هذه الأقواس ، سوف يتم استدعاء الدالة output_high() فقط لعشر مرات . بعد ذلك يتم تنفيذ السطور الثلاثة الأخرى واحد تلو الآخر .
كل من السطور الأربعة فى الحلقة هو استدعاء لدالة . هذه الدوال لم يتم تعريفها عن طريق المبرمج لكنها دوال من صلب المترجم . التعبير أو التعبيرات الموجودة داخل الأقواس () للدالة المستدعاة هى بيانات يتم تمريرها إلى الدالة . هذه البيانات تسمى وسائط arguments فى الاستدعاء وتسمى بارامترات parameters فى الدالة .
فى لغة السى ، الحالة الخاصة للعبارة الصحيحة (شرط صحة العبارة) هى أن أى تعبير يكون متبوعا بالفاصلة المنقوطة “;” . لاحظ أنه ليس لمجرد أن تكون العبارة صحيحة أن يعنى ذلك أنها منطقية . على سبيل المثال ، فيما يلى عبارة لغة سى صحيحة :
مع ذلك ، فإنها لا تفعل أى شىء . بعض برامج الترجمة قد تقوم بعملية الجمع والتى قد تستغرق بعض الوقت ولكن لا يفعل أى شىء أكثر من ذلك . برامج البرمجة الجيدة سوف تعطى تحذير على هذا السطر لأن المبرمج ربما قام بعمل خطأ مطبعى .
كتابة الفاصلة المنقوطة “;” مع عدم وجود تعبير قبلها ، هو حالة خاصة لاستدعاء عبارة فارغة تسمى null statement ، وهى لا تفعل شىء .
فى لغة السى ليس هناك عبارة تعيين (تخصيص) كما هو الحال فى بعض اللغات الأخرى ، بدلا من ذلك هناك "عامل التعيين" وهو علامة التساوى “=” ، على سبيل المثال :
هذا السطر عبارة عن التعبير “x=3” والذى يتكون من متغير ، وعامل ، وثابت . هذا التعبير expression مع الفاصلة المنقوطة “;” يصنع عبارة statement . دائما يتم تعيين (تخصيص) القيمة الموجودة على الجانب الأيمن إلى المتغير الموجود على الجانب الأيسر .
5- الزمن (الوقت) Time :
الحروف “ms” فى كلمة delay_ms تعنى ملى ثانية . وحدات الزمن التى يكثر استخدامها فى البرامج هى :
• النانو ثانية 0.000,000,001 seconds .
• الميكروثانية 0.000,001 seconds .
• الملى ثانية 0.001 seconds .
على سبيل المثال ، هناك مليون ميكروثانية فى الثانية الواحدة .
6- دقة الكتابة Typing Accuracy :
دقة الكتابة تكون مهمة جدا عند إنشاء كود لغة السى . علامات الترقيم ، والتى إما أن تكتب بشكل خاطىء أو يتم حذفها ، يمكن أن تتسبب فى الكثير من الصداع بسبب عدم ترجمة البرنامج . المترجم يرى ما تكتبه بالضبط .
على سبيل المثال ، إذا نسيت قوس البداية “{“ فى سطرة عبارة for ، عندئذ فإن المترجم سوف يطلق رسالة بوجود خطأ عندما يصل إلى قوس النهاية “}” بعد أربع أسطر أسفل من مكان الخطأ الفعلى .
الفاصلة المنقوطة “;” التى تلى العديد من العبارات والإعلانات تكون مهمة لمساعدة المترجم لمعرفة متى ينتهى الإعلان أو العبارة . فهى لا تستخدم أبدا عند نهاية توجيه المعالج الذى يبدأ بالرمز “#” . فقد أو زيادة الفاصلة المنقوطة “;” أو القوس “{“ يمكن أن ينشىء رسائل خطأ مربكة . محرر لغة السى الجيد يسلط الضوء على مجموعة الأقواس المتوائمة
“{ }” و “()” علاوة على على العناصر النحوية لمنع الأخطاء أثناء الكتابة ، وذلك بتمييزها بألوان مختلفة .
7- تنسيق النص Text Formatting :
تنسيق المسافات الفارغة (البيضاء) مثل المسافات spaces و التبويبات tabs و مكان الرجوع من أول السطر ، وغيرها يتم تجاهله من قبل المترجم .
التنسيق يجعل الكود قابل للقراءة . المسافة البيضاء ،الناتجة من تخطيط البرنامج بحيث يبدو أكثر تنظيما ، تعتبر شىء جيد . وهى تأتى من استخدام المسافات والتبويبات والأسطر الفارغة . تستخدم التبويبات من أجل عمل تدرجات بدلا من استخدام عدد من المسافات . عدد المسافات لكل تبويب عادة يكون قابل للضبط . ثلاثة مسافات لكل تبويب تعمل بشكل جيد . لاحظ أن الأسطر الموجودة داخل الدالة إعلاه تكون متدرجة والخطوط داخل الحلقة تكون أكثر تدرجا . التدرج ، والمسافات البيضاء الأخرى اختيارية ، ولكن ينصح بها بشدة .
8- ملاحظات التوافق Compatibility Notes :
التعليق “//” هو بناء للغة C++ ، ومعتمد فقط من قبل بعض برامج الترجمة وليس كلها .
معظم برامج الترجمة تكون حساسة لحالة الحروف . على سبيل المثال ، Output_High() لن يتم التعرف عليها ولكن output_high() سوف يتم التعرف عليها . فى الوضع الافتراضى المترجم CCS C يكون غير حساس لحالة الحروف . لجعله حساسا ، يجب عليك استخدام توجيه المعالج “#case” .
الدوال الموجودة ضمن المترجم مثل output_high() و delay_ms() ليست من لفة السى القياسية ، حيث ينفرد بها المترجم CCS C .
|