بازدیدها: 913
هر برنامه به زبان C مجموعه ای از یک یا چندین تابع است که یکی از آنها تابع اصلی بنام ()main است، مابقی توابع از داخل این تابع اصلی فراخوانی می شوند. تابع در واقع یک زیر برنامه است که توسط برنامه نویس برای انجام کارهای خاص نوشته و فراخوانی می شود. به طور کلی توابع به دو دسته تقسیم می شوند:
در اینجا ما نوع دوم را توضیح می د هیم. در کل این گونه توابع دو حالت دارند یکی اینکه مقدار برگشتی دارند و دیگری مقدار برگشتی ندارند. مقدار برگشی یعنی چی؟
هر تابع بک مقدار ورودی دارد و یک مقدار خروجی، یک تابع با قابلیت مقدار برگشتی یعنی اینکه ما یک مقداری به ورودی تابع می دهیم و در این تابع یک سری عملیات بر روی این مقدار ورودی انجام می شود و در نهایت جواب این عملیات برگشت داده می شود. و در نوع دوم تابع می تواند هم مقدار ورودی داشته باشد و هم نداشته باشد که مثلا اگر یک مقدار ورودی داشته باشد با این مقدار ورودی یک سری کارها را انجام می دهد و در نهایت هم برمیگردد و هیچ مقدار برگشتی هم ندارد. در زیر با مثال های زیادی این مطالب را روشن تر می کنیم:
محل نوشتن توابع کجاست؟ شما به دو طریق می توانید تابع ها را در محل های صحیح بنویسید:
1) توابع را ترتیب قبل از تابع اصلی ()main بنویسید.
2) توابع را به ترتیب بعد از تابع اصلی ()main بنویسید که در این روش باید قبل از تابع ()main فقط اسم توابع را معرفی کنیم.
نکته: اگر در پرانتز عبارت (void) نوشته شود یعنی تابع مقدار برگشتی ندارد.
void main(void){ دستورات }
به این تابع، تابع اصلی ()main گفته می شود.
1) نوشتن توابع قبل از main :
void mohsen(void){ دستورات زير برنامه } void main(void){ //www.picpars.com دستورات mohsen(); }
در اینجا ما یک تابع با اسم mohsen تعریف کردیم و اگر توچه کنید قبل از تابع main تعریف کردیم و حالا آن را در تابع اصلی فراخوانی کردیم.
2) نوشتن تابع بعد از main :
void mohsen(); void main(void){ //دستورات mohsen(); } void mohsen(void){ //دستورات زير برنامه }
در این روش ابتدا نام تابع mohsen را تعریف کردیم و در آخر بعد از main آن را نوشتیم.
یک مثال از تابع که مقدار برگشتی ندارد:
#include// معرفي ميکر//www.picpars.com #include //فراخواني دستورات استاندارد ورودي خروجي #include // فراخواني تابع تاخيري #include // فراخواني دستورات ال سي دي #define xtal 8000000 #asm // شروع دستورات اسمبلي .equ __lcd_port=0x18; PORTB //معرفي پورت ال سي دي #endasm // پايان دستورات اسمبلي char i; void fanction(){ //ايجاد يک تابع i=i+2; } void main(void){ // تابع اصلي char buffer[10]; // در اين متغيير اطلاعات به صورت رشته قرار ميگيرند lcd_init(16); // ال سي دي با 16 ستون while(1){ fanction(); // فراخواني تابع فانکشن lcd_clear(); // پاک کردن ال سي دي sprintf(buffer,"MGH=%d",i); //آماده کردن اطلاعات به صورت رشته lcd_puts (buffer); // ارسال اطلاعات به ال سي دي delay_ms(100); // تاخير 100 ميلي ثانيه } }
در این مثال تابع function به صورت مدوام در اول حلقه بی نهایت فراخوانی می شود، بنابراین میکرو ابتدا به آدرس این تابع می رود و دستورات داخل آن را اجرا می کند و به { که رسید به آدرس قبلی برمیگردد و دستور lcd_clear را اجرا می کند. در کل اصول کار برنامه به این صورت می باشد که در هر بار اجرای تابع عدد 2 به متغیر سراسری i اضافه می شود و در نهایت روی ال سی دی نمایش داده می شود.
یک مثال از تابع با مقدار برگشتی:
#include// معرفي ميکر//www.picpars.com #include //فراخواني دستورات استاندارد ورودي خروجي #include // فراخواني تابع تاخيري #include // فراخواني دستورات ال سي دي #define xtal 8000000 #asm // شروع دستورات اسمبلي .equ __lcd_port=0x18; PORTB //معرفي پورت ال سي دي #endasm // پايان دستورات اسمبلي char i; char fanction(unsigned char a){ //ايجاد يک تابع a=a*2; return a; // برگرداندن مقدار a } void main(void){ // تابع اصلي char buffer[10]; // در اين متغيير اطلاعات به صورت رشته قرار ميگيرند lcd_init(16); // ال سي دي با 16 ستون while(1){ i=fanction(5); // فراخواني تابع فانکشن lcd_clear(); // پاک کردن ال سي دي sprintf(buffer,"MGH=%d",i); //آماده کردن اطلاعات به صورت رشته lcd_puts (buffer); // ارسال اطلاعات به ال سي دي delay_ms(100); // تاخير 100 ميلي ثانيه } }
این مثال مانند مثال قبلی است با این تفاوت که تابع ما مقدار برگشتی دارد. تابع را این گونه فراخوانی کردیم (i=fanction(5 یعنی اینکه عدد 5 را وارد تابع کن و در متغیر a ذخیره کن و بعد متغیر a را در 2 ضرب کن و در a قرار بده و بعد نوشتیم return a یعنی هر چه در متغیر a هست را به fanction نسبت بده و در نهایت هم مقدار عدد 10 که در fanction هست در متغیر i قرار می گیرد.
char fanction(unsigned char a,unsigned char b,unsigned char c){ //ايجاد يک تابع unsigned char d; d=a+b+c; return d; // برگرداندن مقدار a } void main(void){ // تابع اصلي//www.picpars.com while(1){ i=fanction(10,20,30); // فراخواني تابع فانکشن } }