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

blog
gasemi.m100
۱۴۰۳-۰۴-۰۹
8 دقیقه

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

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

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

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

نکته✅

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

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

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

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

 

 

نکته✅

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

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

توجه⚡

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

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

نکته✅

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

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

blink2 یک پارامتر می‌گیرد ولی هیچ مقداری باز نمی‌گرداند.

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)

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

تبدیل عدد به رشته (استرینگ)...

جلسه قبل
profile

Arduino captain

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

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

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

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

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

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

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

سیسوگ‌شاپ | فروشگاه محصولات Quectel

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

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

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

سیکار | اولین مرجع متن باز ECU در ایران

بررسی و ارائه اطلاعات مربوط به ECU (واحد کنترل الکترونیکی) و نرم‌افزارهای متن باز مرتبط با آن برو به سیکار
become a writer

نویسنده شو !

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

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

نویسنده شو !

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

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

سیسوگ‌شاپ

فروشگاه محصولات Quectel

پالت

سیسوگ فروم

محلی برای پاسخ پرسش‌های شما

سیسوگ جابز
سیسوگ
سیسوگ فروم

سی‌کار

اولین مرجع متن باز ECU در ایران

سیسوگ مگ

آی‌سی

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

سیسوگ آکادمی

پالت

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

دیدگاه ها

profile
مناف نیکنام گفت :
۱۴۰۳-۱۲-۰۴ ۱۳:۳۹

اخه اخوی کپی هم میکنید حداقل ترجمشو یکم زحمت کشیده فقط به ترانسلیت نسپارید اخه خودت یبار خوندی؟

profile
Shadow گفت :
۱۴۰۳-۱۲-۱۲ ۱۲:۲۱

سلام دوست عزیز بله یک سری مشکلات ترجمه داشت این مطلب ویرایش شد. ممنون از توجهتون

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

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

become a writer

نویسنده شو !

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

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

نویسنده شو !

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

ارسال مقاله