تبلیغات

با عرض سلام خدمت دوستان عزیزم
در جلسه گذشته در مورد تعریف توایع و نحوه‌ی معرفی ورودی و خروجی‌های توابع بحث کردیم. در این جلسه در مورد فراخوانی توابعی که تعریف شده‌اند و نحوه‌ی کار با ورودی و خروجی‌های آن‌ها بحث خواهیم کرد.

 

   فراخوانی توابع

 

 

برای اجرای دستورات هر تابع، باید تابع فراخوانی شود. برای فراخوانی توابع، کافیست نام تابع را در هر قسمت از برنامه که به آن تابع نیاز هست، بنویسید. سپس مقادیری که باید به عنوان ورودی به تابع تحویل شود را در جلوی نام تابع در داخل یک پرانتز بنویسید. و در پایان هم ";" را فراموش نکنید. به عنوان مثال برای تابعی با نام move به شکل زیر عمل می‌کنیم:

move(مقادیر ورودی)

 

   نحوه‌ی تعیین ورودی‌های تابع

 

 

به عنوان مثال تابع ()move را  از جلسه‌ی گذشته در نظر بگیرید. این تابع برای کنترل حرکت روبات نوشته شده است و باید یک کاراکتر را به عنوان ورودی دریافت کند.فرض کنید در قسمتی از برنامه می‌خواهیم به روبات دستور جلو رفتن بدهیم. برای این کار کافیست تابع ()move را با مقدار ورودی (‘F’)، فراخوانی کنیم. برای این کار، کافیست دستور زیر را بنویسید:

move(‘F')

اگر این تابع چند ورودی داشت، باید در هنگام فراخوانی مقادیر توسط کاما از یکدیگر جدا شوند. به عنوان مثال:

temp( ‘F’ , 200);


همان‌طور که می‌بینید تابع temp دو ورودی دارد که یکی از جنس حروف (Character) و دیگری از جنس عددی (Integer) است. دقت کنید که اگر جنس پارامتر از Char باشد، باید کاراکترهایی که به عنوان ورودی به تابع ارسال می‌شوند، در داخل  ‘  ‘  قرار گیرند. اطلاعاتی که در هنگام فراخوانی تابع، در جلوی نام تابع (در داخل پرانتز) به عنوان مقادیر ورودی ظاهر می شوند، آرگومان تابع نام دارند. دقت داشته باشید پارامتر ها متغیرهایی هستند که هنگام تعریف تابع، در جلوی نام تابع و در داخل پرانتز قرار می گیرند، اما آرگومان‌ها در هنگام فراخوانی در جلوی نام تابع درج می‌شوند.

 

   نحوه‎ی استفاده از خروجی تابع

 

 

همان‌طور که در جلسه‌ی گذشته توضیح داده شد، هر تابع می‌تواند یک مقدار را به عنوان خروجی تابع به فراخواننده بازگرداند. این مقدار از طریق نام تابع قابل دسترسی خواهد بود. یعنی همان‌طور که مقداری که داخل هر متغیر ذخیره شده است از طریق نام آن متغیر قابل دسترسی است، مقداری که به عنوان خروجی تابع بازگردانده شده است هم، از طریق نام تابع قابل دسترسی است. به عنوان مثال تابع زیر را در نظر بگیرید:

int   compass ()
 {
 دستورات مربوطه;
 return   degree;
}

این تابع برای خواندن مقدار سنسور قطب‌نمای الکتریکی نوشته شده است که این مقدار همان زاویه‌ی قطب نما نسبت به قطب‌های کره‌ی زمین است؛ و یک خروجی از جنس int دارد که حامل زاویه‌ای است که قطب نمای الکتریکی نشان می‌دهد. حالا هر کجا که نام تابع نوشته شود، یکبار تابع فراخوانی می‌شود و خروجی تابع از طریق نام تابع قابل دسترسی خواهد بود. به عنوان مثال اگر بخواهیم خروجی تابع بالا را از طریق یک دستور شرطی چک کنیم، می‌توان دستور زیر را نوشت.

if ( compass() > 128)
{ دستورات;}
 

همچنین می‌توان مقدار خروجی را داخل یک متغیر کمکی ذخیره کرد، به‌عنوان مثال:

Temp= compass();
 

دقت داشته باشید که اگر تابع، پارامتر ورودی هم نداشته باشد، باید پرانتزِ باز و بسته جلوی نام تابع درج شود.

همان‌طور که گفته شد، ما نمی‌توانیم هیچ بخش از برنامه را خارج از توابع بنویسیم، یعنی هر خط از برنامه‌ی ما، باید حتماً در یکی از توابع گنجانده شده باشد. اما سوال این جاست که تا کنون که ما کار با توابع را بلد نبودیم، دستوراتی که می‌نوشتیم چگونه اجرا می‌شدند؟

تابع main():
 

در هر برنامه‌ای که در زبان C نوشته می‌شود، می‌بایست تابعی با نام ()main وجود داشته باشد. روند اجرای برنامه از همین تابع شروع می‌شود، یعنی اولین تابعی که دستوراتش اجرا می‌شود همین تابع است. برای اجرای هر برنامه‌ای که ما در زبان C می‌نویسیم، تابع ()main در برنامه‌یِ ما، توسط سیستم عامل فراخوانی می‌شود، و پس از اجرای تمام دستورات ()main، کنترل دوباره به سیستم عامل باز گردانده می‌شود.  در حقیقت، تابع ()main تنها تابعی است که وجودش الزامی است و با اتمام کار این تابع، روند اجرای دستورات برنامه هم پایان می‌رسد.

در محیط CodeVision هم در همان ابتدا تابع ()main توسط CodeWizard تعریف می‌شود و دیگر نیازی نیست ما مجدداً این تابع را تعریف کنیم. با کمی دقت می‌توانید الگوی تعریف تابع ()main را در برنامه پیدا کنید. نکته‌ی مهم این که همان‌طور که در بالا گفته شد، پس از اجرای دستورات تابع ()main کار برنامه به اتمام می‌رسد و میکروکنترلر دیگر کاری انجام نمی‌دهد، به همین خاطر اگر می‌خواهیم برنامه‌ای که نوشته‌اید مکرراً اجرا شود باید آن‌ها را در داخل یک حلقه‌ای بنویسیم که دستوراتش بی نهایت بار تا زمانی که میکروکنترلر روشن است انجام شود. برای این کار می‌توانید از حلقه‌ی ()while به شکل زیر استفاده کنید:

while(1)
{
دستورات;
}
 

نوشتن عدد "1" به جای شرط حلقه، در داخل پرانتز، به این مفهوم است که شرط اجرای حلقه همواره برقرار است و دستورات داخل حلقه باید بی‌نهایت بار انجام شوند. اما خوشبختانه CodeWizard این کار را هم برای ما انجام داده است و حلقه‌ای به شکل بالا برای کار ما تعریف کرده است که ما دستوراتمان را در داخل آن حلقه بنویسیم. (برای یاد آوری رجوع شود به جلسه‌ی 26).

 

 

  نکته‌ی مهم در مورد تعریف توابع

 

 

توابع باید در کدام قسمت برنامه تعریف شوند؟ برای این که توابعی که تعریف می‌کنیم در همه‌ی بخش‌های برنامه قابل استفاده و فراخوانی باشند، باید آن‌ها درست قبل از تابع ()main تعریف کنیم. یعنی ابتدا خطی که الگوی تابع ()main نوشته شده است را پیدا کنید، سپس هر تابعی که می‌خواهید را قبل از آن تعریف کنید. البته بحث در مورد حوزه‌ی استفاده و دسترسی به توابع بسیار مفصل است،اما این مطالب برای انجام کارهای ما کفایت می‌کنند. برای کسب اطلاعات بیشتر در این زمینه، می‌توانید به بخش توابع از ک تاب مهندس جعفرنژاد قمی یا سایر کتاب‌های آموزش زبان C مراجعه کنید.  

 

  نکته‌ای مهم در مورد شروع برنامه‌های ساخت‌یافته

 

 

ابتدا بدون پرداختن به جزئیات پیاده سازی توابع، ورودی‌ها و خروجی‌های تابع، بدنه‌ی اصلی برنامه را بنویسید. به عبارت دیگر، در قدم اول لازم نیست تک تک دستورات داخل توابع را بنویسید، ابتدا فقط تعیین کنید هر تابع قرار است چه عملی را انجام دهد و از آن در قسمت‌های مورد نیاز استفاده کنید.


در قدم بعد، به تعریف جزئیات داخل توابع بر اساس نیازی که به آن‌ها وجود دارد بپردازید.

منتظر سولات و نظرات دوستان خوبم هستم.
پیروز باشید