تعریف تابع یک رکن اصلی در برنامه نویسی استاندارد به شمار می رود. به کمک توابع برنامه ها خوانا تر شده و روال خطایابی بسیار تسهیل خواهد شد. یک برنامه سنگین جهت استاندارد سازی باید از چندین تابع تشکیل شود. در این برنامه هر تابع مسئولیت اجرای هر بخش را بر عهده دارد. به عنوان مثال در یک برنامه ترموستات، یک تابع مسئول دریافت دمای مد نظر از کاربر است. در طرف دیگر، یک تابع وظیفه اندازه گیری دمای فعلی محیط و مقایسه آن با دمای دریافتی کاربر را برعهده دارد. در نهایت تابع دیگری قطع یا وصل رله فن را با توجه به سیگنال دریافتی از تابع قبلی، اجرا می کند. توابع مطابق تعریف و پیاده سازی، تنها می توانند یک خروجی تولید کنند. به عبارت دیگر، یک تابع با اجرای خود، فقط یک مقدار را در خروجی قرار داده و نمی تواند چندین مقدار را return نماید. اما به کمک مفهومی به اسم اشاره گر، یک تابع قادر است تا تعداد بی شماری خروجی تولید نماید. در ادامه، با مرجع تخصصی رزبری پای و آردوینو به زبان فارسی، دیجی اسپارک، همراه باشید.
نقش تابع در برنامه نویسی و کاربرد آن
توابع در برنامه نویسی ساخت یافته، نقش مهم و اساسی را بازی می کنند. به کمک توابع می توان یک مسئله بزرگ را به چندین مسئله کوچکتر تبدیل نمود. بدین ترتیب روال حل مسئله بسیار ساده تر می شود. همچنین در صورت بروز اشکال، روال خطایابی بسیار ساده خواهد شد. چراکه کافیست اجرای تابع ها را بررسی کنیم تا به محل خطا پی ببریم. بدین ترتیب به کمک توابع روال برنامه نویسی بسیار کارآمد و کدها کاملا خوانا خواهند شد. برای روشن تر شدن موضوع، به دو برنامه ای که در ادامه می آید؛ دقت کنید. برنامه زیر در حالت بدون تابع نوشته است.
void setup(){ Serial.begin(115200); Int x, y; } void loop(){ Serial.println(x*y); Serial.println(x-y); Serial.println(x/y); Serial.println(x+y); }
در ادامه برنامه زیر در حالت تعریف تابع نوشته شده است. به کدهای این برنامه دقت کنید.
void setup(){ Serial.begin(115200); } void loop(){ Int x,y; Serial.println(calc(x,y,”add”)); } Int calc(int x, int y , String op){ If(op==“add”) return x+y; //*********************** If(op==“diff”) return x-y; //************************* If(op==“div”) return x/y; //***************************** If(op==“mul”) return x*y; }
در صورتیکه به کدهای برنامه تعریف شده با تابع دقت کنید؛ خواهید دید که در قسمت loop برنامه روال منظم تری شکل گرفته؛ در حالیکه در برنامه بدون تعریف تابع قسمت loop بسیار شلوغ شده است. این موضوع زمانی جدی تر خواهد شد که تعداد خط کدهای برنامه بسیار زیاد باشد؛ در اینجاست که اهمیت تابع بیش از پیش روشن تر خواهد شد.
همانطور که اطلاع دارید و در تصویر فوق هم قابل مشاهده است؛ یک تابع تعدادی وروی را دریافت کرده و یک خروجی تولید می کند. این مفهوم دقیقا مشابه مفهوم تعریف تابع در ریاضی است. در برنامه نویسی هم یک تابع تعدادی ورودی دریافت کرده و تنها می تواند یک خروجی تولید کند. به عنوان مثال تابعی را در نظر بگیرید که با دریافت تعدادی ورودی، به عنوان مثال ۴ ورودی، بزرگترین مقدار را در خروجی نمایش می دهد.
اما در شرایط دیگر، فرض کنید که در تابع فوق قصد داریم تا دو عدد که بیشترین مقدار را داردند، در خروجی قرار دهیم. از آنجاییکه هر تابع تنها می تواند یک خروجی تولید کند، لذا این امر ممکن نیست. برای این مورد می توان از متغیرهای گلوبال هم استفاده نمود؛ اما در این جا ما قصد داریم تا با روشی غیر از روش متغیرهای گلوبال خروجی های تابع را افزایش دهیم. برای این مورد از مفهومی به نام اشاره گر استفاده می کنیم. برای تشریح این مورد ابتدا قسمت بعد را به تعریف اشاره گر اختصاص داده و سپس در نهایت روش کار را شرح خواهیم داد.
اشاره گر تعریف و کاربرد
اشاره گرها یکی از مهم ترین ابزارها در برنامه نویسی زبان c، c++(آردوینو) و سایر زبان های برنامه نویسی به شمار می روند. اشاره گر ها یک لایه پایین تر از متغیرها هستند، در حقیقت به کمک اشاره گرها می توانیم محل قرار گیری متغیر در حافظه را در اختیار داشته باشیم. پیشتر در آموزشی به تقسیم بندی حافظه و نحوه ذخیره متغیرها در حافظه پرداخته ایم. این آموزش را با کلیک بر روی این لینک می توانید مطالعه کنید. فرض کنید متغیری از نوع صحیح را با دستور زیر تعریف کرده ایم.
int x
زمانی که دستور فوق اجرا می شود، برای متغیر x در حافظه آدرسی ایجاد می گردد. در حقفیقت زمانی که شما قصد دارید تا با متغیر خود در برنامه کار کنید، به آدرس متغیر اشاره می کنید. با دسترسی به آدرس متغیر، مقدار آن قابل برداشت خواهد بود. در حقیقت در کدهای برنامه، ما با آدرس متغیر و نه نام آن سر و کار داریم. برای روشن تر شدن موضوع به جدول زیر دقت کنید.
آدرس | متغیر |
۰x2c | int x |
۰x54 | float y |
۰x6e | double z |
۰xdd | unsigned long f |
مطابق آنچه که در جدول فوق قابل مشاهده است، هر متغیر در حافظه پس از تعریف، یک آدرس به آن تخصیص داده می شود. به عنوان مثال برای متغیر x آدرس ۰x2c تعیین شده است. پس آنطور که از بحث آموختیم، هر متغیر دارای آدرس منحصر به فرد خود است. در اینجا با مفهومی به نام اشاره گر آشنا می شویم. به کمک اشاره گر می توانیم به آدرس یک متغیر دسترسی داشته باشیم. برای این مورد، تعریف زیر را در نظر بگیرید.
int *x
برای تعریف متغر از نوع اشاره گر، از علامت * پیش از متغیر استفاده می کنیم. در این جا برای دسترسی به آدرس متغیر، عملگر & باید پیش از متغیر قرار گیرد. به عنوان مثال داریم.
&x
توجه : عملگر & نیز برای متغیرهای عادی هم کاربرد داشته و آدرس آن ها را بدست می آورد.
بدین ترتیب به کمک تعریف متغیر از نوع اشاره گر، می توانیم به آدرس آن دسترسی داشته باشیم. در کنار این، زمانیکه قصد داشته باشیم تا به متغر از نوع اشاره گر مقدار دهی کنیم، به صورت زیر عمل می کنیم.
int *x=5;
مبحث اشاره گیر یک مبحث بسیار عمیق است که شاید نتوان در یک آموزش به طور کامل، به آن پرداخت. حال که در این قسمت با مفاهیم پایه اشاره گر آشنا شدیم، قسمت بعدی را به نحوه ایجاد چند خروجی برای یک تابع از طریق اشاره گر، اختصاص می دهیم.
نحوه ایجاد چند خروجی برای یک تابع به کمک اشاره گر
در قسمت پیش به مفاهیم پایه ای و اولیه اشاره گر پرداختیم. آنطور که از قسمت پیشین دریافتیم، به کمک اشاره گر می توانیم به آدرس یک متغیر دسترسی داشته باشیم. این دسترسی سبب می شود تا به طور مستقیم، به متغیر مقدار دهی کنیم. همانطور که پیشتر گفتیم، به کمک اشاره گر می توانیم برای یک تابع چندین خروجی تولید کنیم. این خروجی ها دقیقا در ورودی تابع قرار می گیرند. برای این مورد، متغیرهایی را در حالت عادی تعریف می کنیم. سپس آدرس متغیرها را در ورودی تابع قرار می دهیم. ورودی تابع که خود از نوع اشاره گر تعریف شده، نتیجه محاسبات را در آدرس متغیرها قرار می دهد. بدین ترتیب خروجی تابع در ورودی قرار گرفته و هر تعداد که خروجی نیاز باشد، به این روش تعریف می شود. جهت روشن شدن این موضوع، به برنامه زیر دقت کنید.
void setup() { // put your setup code here, to run once: Serial.begin(115200); delay(500); int a=5,b=6; calc(&a,&b); Serial.println(a); Serial.flush(); Serial.println(b); Serial.flush(); } void loop() { } void calc(int *x , int *y) { int tmp = *x; *x = (*x) + (*y); *y = (tmp) * (*y); }
با دقت به برنامه فوق، مشاهده می کنیم که در ورودی های تابع، خروجی ها قرار گرفته اند. در رابطه با تابع calc، به موارد زیر دقت کنید.
- ورودی های تابع از نوع اشاره گر تعریف شده
- نتیجه محاسبات در اشاره گر ها قرار گرفته است.
در تابع calc یک متغیر به اسم temp تعریف کرده ایم؛ این متغیر مقدار اولیه x را برای محاسبات بعدی ذخیره می کند؛ چراکه نتیجه جمع دو متغیر در x ذخیره شده و نتیجه ضرب دو متغیر در y ذخیره خواهد شد. اما سوال اصلی شاید در این لحظه این باشد که این تابع چگونه نتیجه محاسبات را در ورودی قرار می دهد؟ برای روشن شدن این موضوع، به نحوه ذخیره متغرها در حافظه بر می گردیم. زمانی که دو متغیر a و b تعریف می شوند، این متغیرها در حافظه آدرس مشخصی خواهند داشت. در ادامه، از آنجاییکه تابع calc ورودی هایی از نوع اشاره گر دارد، آدرس دو متغیر a و b را در ورودی تابع calc قرار می دهیم. تابع calc پس از انجام محاسبات، نتیجه را در اشاره گرهای ورودی قرار می دهد. در حقیقت اینجا نتیجه محاسبات در آدرس متغیرهای ورودی قرار می گیرد. از آنجاییکه آدرس متغیرها در برنامه ثابت است، لذا پس از اتمام اجرای برنامه مقادیر محاسبه شده در ورودی های تابع قرار می گیرد.
لوازم مورد نیاز
جمع بندی
اشاره گرها یکی از ابزارهای بسیار مهم، کلیدی و کاربردی در برنامه نویسی به شمار می روند. به کمک این ابزار می توانیم به آدرس متغیرها دسترسی داشته باشیم. یکی از کاربردهای مهم اشاره گرها، ایجاد چندین خروجی برای یک تابع است. همانطور که اطلاع دارید، یک تابع تنها می تواند یک متغیر را در خروجی خود قرار دهد. از آنجاییکه گاهی اوقات نیاز است تا یک تابع چندین خروجی داشته باشد، لذا به کمک مفهوم اشاره گر می توانیم به این مورد دسترسی داشته باشیم. در این آموزش ابتدا به بررسی مفهوم تابع پرداختیم. سپس در ادامه به تشریح مفهوم اشاره گر مشغول شدیم. در نهایت پس از آشنایی با مفهوم اشاره گر، نحوه ایجاد چند خروجی برای یک تابع به کمک اشاره گرها را بررسی نمودیم.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.