قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 03-12-2012, 10:58 AM المشاركة 1   
افتراضي البرمجة المتقدمة الدوال والمكتبات فى مترجم "الميكروسى" Functions and Libraries in mik Twitter FaceBook Google+



البرمجة المتقدمة الدوال والمكتبات فى مترجم "الميكروسى" Functions and Libraries in mikroC





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

الصيغة العامة لتعريف الدالة :

الشكل التالى يوضح الصيغة العامة لتعريف الدالة , حيث يتضمن :
  • تبدأ الصيغة بالنوع type" " ويشير إلى نوع البيانات العائدة returned بواسطة الدالة (نتيجة تنفيذها) .
  • يلى ذلك "اسم الدالة" name .
  • ثم مجموعة من الأقواس ( … , …..) , وبداخلها يتم إعلان أدلة أو وسائط arguments مفصولة بفواصل .
  • وأخيرا جسم الدالة function body , والذى يتضمن كود عمليات الدالة , يكتب داخل مجموعة من الأقواس المعرجة { } .




مثال :

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 03-12-2012, 11:00 AM المشاركة 2   
افتراضي


مثال :
فى المثال التالى :

· نوع type البيانات التى تعود بها الدالة نتيجة لتنفيذها وهى هنا بيلانات لعدد صحيح int .
  • الدالة المسماة Mult تستقبل وسيطين (دليلين) لأعداد صحيحة هما a و b , وتعود (ترجع) returns بحاصل ضربهما كعدد صحيح أيضا .
  • لاحظ أن استخدام الأقواس فى عبارة العودة هو اختيارى .
كود:
int Mult(int a, int b) { return (a*b); }
عندما يتم استدعاء الدالة فإنه عامة يكون من المتوقع أن يكون معطى عدد من الأدلة المعبرعنها فى قائمة أدلة (وسائط) الدالة . على سبيل المثال يمكن استدعاء الدالة السابقة بالطريقة التالية :


كود:
z = Mult(x, y);
حيث z متغير يحتوى على بيانات من نوع الأعداد الصحيحة ة int ( وهو نفس نوع عائد الدالة) . لاحظ أنه تم تعريف الأدلة فى تعريف الدالة وتم تمرير الأدلة عند استدعاء الدالة بشكل مستقل عن بعضهما البعض حتى لو كان لهما نفس الاسم .
  • فى المثال السابق , عند استدعاء الدالة , يتم نسخ المتغير x إلى a والمتغير y إلى b عند الدخول إلى الدالة Mult .
حالات خاصة :

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 03-12-2012, 11:02 AM المشاركة 3   
افتراضي


حالات خاصة :
الدوال الفارغة void :
بعض الدوال لا تعود بأى بيانات . يجب تعريف نوع بيانات مثل هذه الدوال على أنه "فارغ" void .
مثال :

كود:
void LED(unsigned char D) { PORTB = D; }

يمكن استدعاء الدوال الفارغة void بدون تخصيص أى عبارات , لكن نحتاج للأقواس لإخبار المترجم بأنه يتم استدعاء دالة .
مثال :
كود:
LED( );
دوال بدون وسائط :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 03-12-2012, 11:04 AM المشاركة 4   
افتراضي


دوال بدون وسائط :
بعض الدوال ليس بها أى وسائط .
مثال :
فى المثال التالى , الدالة المسماة Compl "تكمل" complements المنفذ PORTC للميكروكونترولر أى تحول أى بت بصفر إلى واحد وأى بت بواحد إلى صفر , بمعنى آخر عكس البتات . وهى لا تعود بأى بيانات void وليس بها وسائط ( ) :

كود:
void Compl( ) { PORTC = ~PORTC; }

يتم استدعاء هذه الدالة كما يلى :


كود:
Compl( );


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 03-12-2012, 11:09 AM المشاركة 5   
افتراضي


عادة يتم تعريف الدوال قبل بدء البرنامج الرئيسى .
فيما يلى أمثلة لبعض تعريفات الدالة واستخدامها فى البرامج الرئيسية :
مثال 1 :
المطلوب :
كتابة دالة تسمى "مساحة الدائرة" Circle_Area لحساب مساحة الدائرة بدلالة نصف القطر ومن ثم استخدام نصف القطر كوسيط للدالة . ثم استخدام هذه الدالة فى برنامج رئيسى لحساب مساحة الدائرة التى نصف قطرها 2.5cm . وحفظ المساحة فى متغير يسمى Circ .
الحل :
يتم إعلان نوع بيانات الدالة كعدد حقيقى float ( بعلامة عشرية) .
يتم حساب مساحة الدائرة عن بواسطة الصيغة :





حيث "r" هو نصف قطر الدائرة . يتم حساب المساحة وحفظ قيمتها فى متغير "محلى" local variable يسمى "s" , حيث يمكن ,بعد ذلك , استعادتها من الدالة :





كود:
float Circle_Area(float radius) { float s; s = PI * radius * radius; return s; }
فيما يلى توضيح لطريقة استخدام الدالة Circle_Area فى برنامج رئيسى لحساب مساحة الدائرة التى نصف قطرها 2.5cm .
يتم تعريف الدالة قبل البرنامج الرئيسى .
داخل البرنامج الرئيسى , يتم استدعاء الدالة لحساب وحفظ المساحة فى المتغير Circ


كود:
/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ This program calls to function Circle_Area to calculate the area of a circle. ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ / This function calculates the area of a circle given the radius / float Circle_Area(float radius) { float s; s = PI radius radius; // PI = 3.14 return s; } / Start of main program. Calculate the area of a circle where radius = 2.5 / void main() { float r, Circ; r = 2.5; Circ = Circle_Area(r); }

مثال 2 :



الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 03-12-2012, 11:13 AM المشاركة 6   
افتراضي


مثال 2 :
المطلوب :
كتابة دالة تسمى Area ودالة تسمى Volume لحساب مساحة وحجم اسطوانة على الترتيب . ومن ثم كتابة برنامج رئيسى لحساب مساحة وحجم اسطوانة نصف قطرها 2.0cm وارتفاعها 5.0cm . وحفظ المساحة فى المتغير cyl_area والحجم فى المتغير cyl_volume .
الحل :
مساحة الاسطوانة يتم حسابها بواسطة العلاقة :



حيث r و h هما نصف قطر وارتفاع الاسطوانة .

حجم الاسطوانة يتم حسابه بواسطة العلاقة :



فيما يلى الدوال التى تحسب مساحة وحجم الاسطوانة :



كود:
float Area(float radius, float height) { float s; s = 2.0PI radiusheight; return s; }
float Volume(float radius, float height) { float s; s = PI radiusradiusheight; return s; }


وفيما يلى البرنامج الرئيسى الذى يقوم بحساب مساحة وحجم اسطوانة نصف قطرها 2.0cm وارتفاعها 5.0cm :

كود:
/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ This program calculates the area and volume of a cylinder whose radius is 2.0cm and height is 5.0cm. ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ / Function to calculate the area of a cylinder / float Area(float radius, float height) { float s; s = 2.0PI radius*height; return s; }
/ Function to calculate the volume of a cylinder / float Volume(float radius, float height) { float s; s = PI radiusradiusheight; return s; }
/ Start of the main program / void main() { float r = 2.0, h = 5.0; float cyl_area, cyl_volume; cyl_area = Area(r, h); cyl_volume(r, h); }



مثال 4-3 :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 03-12-2012, 11:16 AM المشاركة 7   
افتراضي


مثال 3 :
المطلوب :
كتابة دالة تسمى LowerToUppe لتحويل الأحرف الصغيرة lowercase إلى أحرف كبيرة uppercase .
الحل :
قيمة كود أسكى ASCII لأول حرف كبير (‘A’) هى 0x41 . بالمثل , قيمة كود أسكى لأول حرف صغير (‘a’) هى 0x61 .وبالتالى يمكن تحويل الأحرف الصغيرة إلى مكافئها من الأحرف الكبيرة عن طريق طرح 0x20 من الحرف الحرف الصغير .
فيما يلى الدالة المطلوبة :


كود:
unsigned char LowerToUpper(unsigned char c)
{
if(c >= 'a' && c <= 'z') //condition >> limits from 'a' to 'z'
return (c – 0x20);
else
return c;
}


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:332
قديم 03-12-2012, 11:17 AM المشاركة 8   
افتراضي


مثال 4 :
المطلوب :
استخدام الدالة التى أنشأتها فى المثال السابق فى برنامج رئيسى لتحويل الحرف 'r' إلى حرف كبير .
الحل :
فيما يلى البرنامج المطلوب .
يتم إستدعاء الدالة LowerToUpper لتحويل الحرف الصغير بالمتغير Lc إلى حرف كبير وحفظه فى المتغير Uc .

كود:
/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ This program converts the lowercase character in variable Lc to uppercase and stores in variable Uc. ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ / Function to convert a lower case character to upper case / unsigned char LowerToUpper(unsigned char c) { if(c >= 'a' && c <= 'z') return (c – 0x20); else return c; } / Start of main program / void main() { unsigned char Lc, Uc; Lc = 'r'; Uc = LowerToUpper(Lc); }




النماذج الأولية للدالة Function Prototypes :

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 07:37 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025