ساختاردهی کد با استفاده از بلوک‌های تابع و برگرداندن بیش از یک مقدار از تابع | قسمت دوازدهم آموزش آردوینو

blog
۱۴۰۳-۰۴-۰۹
7 دقیقه

در قسمت یازدهم از آموزش آردوینو به بررسی تبدیل عدد به رشته (استرینگ) و همچنین، تبدیل رشته (استرینگ) به عدد، پرداختیم. در این قسمت قصد داریم درباره ساختاردهی کد با استفاده از بلوک‌های تابع در آردوینو و همچنین، برگرداندن بیش از یک مقدار از یک تابع صحبت کنیم.

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

قبلاً با دو تابعی که در هر اسکچ آردوینو وجود دارد آشنا شدید؛ یعنی توابع setup و loop. شما می‌توانید با تعریف return type (نوع بازگشت) (اطلاعاتی که ارائه می‌دهد)، نام آن و هر پارامتر اختیاری (مقادیر) که تابع هنگام فراخوانی دریافت می‌کند، یک تابع ایجاد کنید.

نکته✅

اصطلاحات توابع (functions) و متد‌ها (methods) برای اشاره به بلوک‌های well-defined از کد استفاده می‌کنند.

زبان‌های شی‌گرا مانند C++ که عملکرد را از طریق کلاس‌ها نشان می‌دهند، از اصطلاح متد استفاده می‌کنند. آردوینو از ترکیبی از سبک‌ها استفاده می‌کند (نمونه‌های اسکچ از سبک C استفاده می‌کنند و کتابخانه‌ها معمولاً برای نمایش متد‌های کلاس C++ نوشته می‌شوند).

در اینجا یک فانکشن ساده وجود دارد که فقط یک LED چشمک می‌زند و هیچ پارامتری وجود ندارد و چیزی برنمی‌گرداند (قبل از تابع، void نشان می‌دهد که چیزی برگردانده نخواهد شد):

ورژن زیر دارای یک پارامتر (یک اینتیجر با نام count) است که تعیین می‌کند، چند بار LED چشمک می‌زند:

نکته✅

برنامه‌نویسان باتجربه متوجه خواهند شد که هر دو تابع را می‌توان blink نامید؛ زیرا کامپایلر آن‌ها را بر اساس نوع مقادیر استفاده شده برای پارامتر متمایز می‌کند. این رفتار اضافه‌بار تابع (function overloading) نامیده می‌شود.

تابع blink2() بررسی می‌کند که آیا مقدار count برابر 0 است یا خیر که اگر نباشد، LED چشمک می زند و سپس مقدار count یک واحد کاهش پیدا می کند. این کار تا زمانی تکرار می شود که متغیر count دیگر از 0 بیش تر نباشد.

توجه⚡

گاهی اوقات، یک پارامتر (parameter) در برخی داکیومنت‌ها، به‌عنوان یک ارگومان (argument) ورودی شناخته می‌شود. در پروژه‌های عملی، شما می‌توانید این دو اصطلاح را یکسان در نظر بگیرید.

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

نکته✅

اعلان تابع یک پروتوتایپ (نمونه اولیه) است که دارای مشخصاتی ازجمله: نام، انواع مقادیری که ممکن است به تابع ارسال شود و نوع بازگشتی تابع می‌باشد. فرایند ساخت آردوینو، اعلان‌ها را برای شما در زیر کاور (covers) ایجاد می‌کند؛ بنابراین شما نیازی به پیروی از الزامات استاندارد C برای اعلان تابع جداگانه ندارید.

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

blink3 یک پارامتر دارد و یک مقدار را برمی گرداند:

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

اکثر توابعی که با آن‌ها روبه‌رو می‌شوید، تغییراتی در این فرم‌ها خواهند داشت.

نوع داده (data type)ای که قبل از نام تابع قرار می‌گیرد، نوع برگشتی تابع را نشان می‌دهد. در مورد blink1 و blink2 نوع داده void نشان می‌دهد که هیچ مقداری برگردانده نمی‌شود؛ اما در blink3 نوع داده int نشان‌دهنده آن است یک عدد صحیح برگردانده می‌شود. هنگام ایجاد توابع، نوع بازگشت را متناسب با عملکردی که تابع انجام می‌دهد، انتخاب کنید.

نکته✅

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

تابع blink2 یک پارامتر به نام count دارد (زمانی که تابع فراخوانی می‌شود، مقدار count به‌عنوان پارامتر به تابع منتقل می‌شود). اما تابع blink3 متفاوت است، زیرا یک پارامتر به نام period دارد.

توابع blink2 ،blink1 و blink3 به ترتیب موارد زیر را انجام می‌دهند:

  • blink1: این تابع LED را روشن و سپس خاموش می‌کند.
  • blink2: این تابع در یک حلقه (لوپ) while تعداد دفعات مشخص شده توسط متغیر count را تکرار می‌کند. به این صورت که هر بار LED چشمک می‌زند (روشن و خاموش می‌شود)، منتظر مدت‌زمان مشخصی می‌ماند و این عمل را تا تمام‌شدن تعداد دفعات تکرار می‌کند.
  • blink3: تا زمانی که دکمه‌ای فشار داده نشده باشد، LED چشمک می‌زند و پس از فشاردادن دکمه، این تابع یعنی blink3 تعداد دفعاتی که LED چشمک زده است را به عنوان نتیجه برمی‌گرداند.

برگرداندن بیش از یک مقدار از یک تابع

تا حالا در این مطلب، مثال‌هایی از رایج‌ترین شکل یک تابع (تابعی که فقط یک مقدار یا هیچ مقداری برمی‌گرداند) ارائه کردیم. اما گاهی لازم است که شما بیش از یک مقدار (دو یا چند مقدار) از یک تابع را برگردانید. بنابراین، در ادامه این قسمت روش‌های مختلفی برای این کار توضیح داده می‌شود. ساده‌ترین روش برای درک، این است که تابع برخی از متغیرهای سراسری (global) را تغییر دهد و در واقع چیزی از تابع را برنگرداند:

تابع swap با استفاده از متغیرهای سراسری (global) دو مقدار را تغییر می‌دهد. به‌طورکلی، متغیرهای global به‌راحتی قابل‌درک هستند (متغیرهای global مقادیری هستند که در همه‌جا قابل‌دسترسی هستند و هر چیزی می‌تواند آن‌ها را تغییر دهد)، اما برنامه‌نویسان حرفه‌ای از این متغیر استفاده نمی‌کنند؛ زیرا به‌راحتی می‌توان مقدار این متغیر را تغییر داد یا اگر نام یا نوع یک متغیر سراسری در جایی از اسکچ تغییر کند، ممکن است تابع دیگر کار نکند.

روش بهتر و ایمن‌تر این است که رفرنس‌ها را به مقادیری که می‌خواهید تغییر دهید منتقل کنید و به تابع اجازه دهید از رفرنس‌ها برای تغییر مقادیر استفاده کند. این کار به‌صورت زیر انجام می‌شود:

تابع swapRef مشابه توابع قسمت قبل با پارامترهای یکسان است. اما علامت (&) نشان می‌دهد که پارامترها رفرنس (reference) هستند. این بدان معناست که تغییر در مقادیر درون تابع، مقدار متغیری را که هنگام فراخوانی تابع داده می‌شود را نیز تغییر می‌دهد. سپس کد را با حذف دو علامت در تعریف تابع تغییر دهید.

کد تغییریافته باید به شکل زیر باشد:

اجرای کد نشان می‌دهد که مقادیر عوض نشده‌اند؛ بلکه تغییرات ایجاد شده، به تابع منتقل شده است و  هنگامی که تابع بازگردانده می‌شود، این تغییرات از بین می‌روند.

 

روش دیگر، استفاده از استراکچر (ساختار) C است که می‌تواند چندین فیلد داشته باشد و به شما این امکان را می‌دهد که انواع دیتا را ارسال و برگردانید.

 

تابع swapPair از یک ویژگی زبان C به نام struct (یا استراکچر (structure)) استفاده می‌کند. یک استراکچر می‌تواند تعدادی متغیر یا پوینتر داشته باشد.

حجم حافظه‌ای که یک استراکچر اشغال می‌کند، برابر با حجم عناصر (المنت‌های) آن است (در یک آردوینو 8 بیتی، یک Pair حدود 4 بایت حافظه را اشغال می‌کند، اما در یک برد 32 بیتی، این حجم به 8 بایت افزایش می‌یابد).

در زبان‌های برنامه‌نویسی، استراکچرها (Structs) و کلاس‌ها (Classes) دو مفهوم متفاوت هستند. اگرچه در برخی جوانب شباهت دارند، اما تفاوت‌های مهمی نیز دارند. در زیر به مقایسه این دو پرداخته‌ایم:

استراکچرها (Structs)

  • استراکچرها به‌عنوان یک نوع داده‌ در زبان‌های برنامه‌نویسی معرفی می‌شوند.
  • آن‌ها می‌توانند چندین متغیر داشته باشند.
  • کاربرد اصلی استراکچرها برای نگه‌داری داده‌های مرتبط و ساختارمند است.

کلاس‌ها (Classes)

  • کلاس‌ها نیز نوعی داده‌ هستند، اما به‌عنوان یک مفهوم اصولی در برنامه‌نویسی شیءگرا معرفی می‌شوند.
  • آن‌ها شامل متغیرها (ویژگی‌ها) و توابع (متدها) هستند.
  • کلاس‌ها به‌عنوان قالب‌هایی برای ایجاد شیء‌ها (نمونه‌ها) استفاده می‌شوند.
اطلاعات
1
0
لینک و اشتراک
profile

Arduino captain

متخصص الکترونیک

من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!

مقالات بیشتر
slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

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

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
خانواده سیسوگ

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند.
family

آیسی | موتور جستجوی قطعات الکترونیک

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

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند.
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند.
family

دیدگاه ها

profile
hosi63 گفت :
۱۴۰۳-۰۴-۰۹ ۱۵:۱۰

درود بر شما
خیلی هم عالی . البته برای برگرداندون چند عدد از توابع روش های دیگه ای هم هست . مثل روشی که عدد ثانیه و دقیقه و ساعت توی کتابخانه ds1307 توی کد ویژن بر میگردونه .
لطفا در مورد استراکچر و کلاس ها هم به صورت کامل آموزش و مثال قرار بدید

become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله