اگر قسمت دوم آموزش میکروبلیز قسمت دوم: آموزش زبان برنامهنویسی C را مطالعهکردهباشید به مسائلی همچون اصول اولیه و قواعدکلی برنامهنویسی زبان C اشارهکردیم که توصیه میکنیم قبلاز خواندن این قسمت حتما قسمتقبل را مطالعهکنید چون حتی اگر یک برنامهنویس حرفهای هم باشید حداقل میتواند بهعنوان یادآوری برای شما خالی از لطف نباشد. همانطوریکه گفتهبودیم تا چند قسمت آینده به زبان C خواهیم پرداخت و پساز آن وارد مبحث میکروبلیز خواهیمشد(مطمئنا برای خیلی دوستان که به زبان C مسلط هستند این قسمتها کسلکنندهاست اما ما تلاش میکنیم مقالات را بهگونهای بنویسیم که اگر فردی هم هیچ اطلاعاتی در این زمینه نداشت نیاز نباشد که منابع دیگری را مطالعه کند بلکه با خواندن همین سری از مقالات به یک درک و یک تسلط نسبی در این زمینه برسد). در این مقاله میخواهیم به تعریف اصولی متغیر در زبان برنامهنویسی C بپردازیم. این مبحث بهقدری اهمیت دارد که تصمیم گرفتیم یک مقاله صرفا برای تعریف اصولی متغیر درنظربگیریم.
متغیر چیست؟
اگر بهصورت علمی بخواهیم متغیر را تعریفکنیم درواقع میتوان در یک جمله گفت، دادههایی که دارای مقادیر متفاوتی هستند را متغیر میگویند. حالا اگر متن را بادقت خواندهباشید اولین سوالی که برای شما پیشخواهدآمد این است که “داده چیست؟” درواقع دادها چیزی جز همان اعداد نیستند که بارها و بارها از آنها در شرایط مختلف استفادهکردیم بهطورمثال حرفهای روزمرهی ما هرکدامشان یک عدد هستند و زمانیکه این اعداد کنار یکدیگر قرار میگیرند یک معنی خاص پیدا میکنند. بهطورمثال اعدادی که کلمه BLOOM را تشکیل دادهاند بهصورتزیر میباشند.
B 42 L 4C O 4F O 4F M 4D
خیلی جالب است که بدانیم میکروکنترلرها هم دقیقا همینکار را انجام میدهند البته برای برقراری ارتباط با میکروکنترلرها باید دادههایی را که تعریف میکنیم از قواعد خاصی پیروی کنند. اگر دقیقتر درمورد داده صحبتکنیم به توضیح اعداد میرسیم، پس نیاز است که بدانیم چه قانونهایی برای اعداد در میکروکنترلرها باید رعایتکنیم. یک عدد در زبان C دارای ۳ویژگی زیر است:
- علامت: میتواند بسته به نوع کاربرد مثبت یا منفی باشد.
- نوع: میتواند بسته به نوع کاربرد صحیح یا اعشاری و … باشد.
- اندازه: میتواند بسته به نیاز، مقادیر کم و یا زیاد را درون خود جای دهد و بههمیندلیل حتما باید اندازه آن مشخصشدهباشد.
استفادهاز متغیر ها بهصورت اصولی در برنامهنویسی C
زمانی میتوان گفت که یک متغییر بهصورت اصولی در برنامه تعریفشدهاست که دارای شرایطزیر باشد:
- خوانابودن اسم متغیر
- دقتکردن به نوع متغیر
- دقتکردن به اندازه متغیر
- دقتکردن به علامت متغیر
اجازهدهید با یک مثال به اهمیت موضوع بپردازیم. فرضکنید به شما گفتهشده متغیری برای دریافت دیتا از یک سنسور(بهطورمثال سنسور دما و رطوبت DHT22) تعریفکنید. راهحل چیست؟ دقتکنید که اگر در اینجا با اندازه متغیرها آشنا نباشید به مشکل برخورد خواهیدکرد. برای حل این مسئله ابتدا با یکدیگر جدولی را که در ادامه قرار میدهیم را مرور میکنیم.(لطفا تکتک مقادیر جدول را موردبررسی قراردهید برای این کار هم کافیاست نوع موردنظر را انتخابکنید و درنهایت سرچکنید.)
الگوریتم حل مسئله در صورت سوال گفتهشدهاست که یک سنسور دما و رطوبت داریم پس اولین جرقهای که در ذهن ما بهوجود خواهد آمد این است که این یک سنسور دما، خروجی آن غالبا بهصورت اعشاری است پس نکته اول اینجا است که باید متغیر یا از نوع Float یا Double انتخابشود خب تااینجا خیلیاز گزینهها حذفشدند حال نوبت به این میرسد که آیا نوع آن Float باشد یا Double؟ اگر به سایز این دو در جدول نگاهکنیم به این نتیجه خواهیمرسید که ۴بایت برای ذخیره اطلاعات سنسور کافیاست پس نهایتا نوع Float را انتخاب میکنیم.
float temperature;
توصیه: سعیکنید که از راهحل بالا بهعنوان یک اصل کلی در تعریف متغیرهایتان استفادهکنید و از خودتان سوالاتی بپرسید(به چه مقدار فضا نیاز دارم؟ آیا نیاز است که خروجی را حتما از نوع double درنظر بگیرم؟ آیا نیاز به استفادهاز کلاس حافظه است؟ و… ) و سپس متغیر را تعریفکنید شاید در کدهای کوچک خیلی تغیری را مشاهد نکنید اما در کدهایی با خطوط بالا با مشکلاتی چون کمبود حافظه و… برخورد خواهید کرد پس چه بهتر که از همین ابتدا اصولی برنامه را بنویسیم.
دقتکنید انتخاب صحیح یک متغیر (نوع،اندازه و علامت ) بهقدری مهم است که میتواند محصول شما را با شکست مواجهکند( لطفا خیلی به این موضوع دقت کنید).
تعریف متغیر به صورت اصولی در برنامهنویسی C
قبلاز اینکه بخواهیم این بخش را توضیحدهیم اجازهدهید یک عبارت را تعریفکنیم و به توضیح و تفسیر آن در زبان C بپردازیم و درنهایت به تعریف اصولی متغیر در زبان C بپردازیم. دقتکنید که این مبحث در میکروبلیز هم صدق میکند.( بهعبارتدیگر تقریبا میتوان گفت تمامی مباحث در میکروبلیز هم کاربرد دارد پس لطفا بادقت مباحث را موردمطالعه قراردهید.)
کلاس حافظه چیست؟
پاسخ این است که کلاس حافظه هر متغیر دو چیز اساسی را برای آن متغیر تعیین میکند:
- مدت حضور یا همان طول عمر(Life Time) آن متغیر
- محدوده حضور متغیر در برنامه(Scope)
پس باتوجهبه این ۲مورد که ذکر شد، ما میتوانیم برنامههایی را بنویسیم که :
- از منابع حافظه میکروکنترلر بهخوبی بهره ببرند و بیمورد حافظه اشغال نشود.(خیلی نکته مهمیه)
- سرعت اجرای بالاتری دارند
- رفع برخی از خطاها به همراه سادهسازی عیب یابی سیستم
انواع کلاس حافظه چیست؟
چهارنوع کلاسهای حافظه در زبان C و C++ بهصورت مشترک تعریفشدهاست:
- اتوماتیک(Automatic)
- خارجی(Extern)
- استاتیک(Static)
- ثبات(Register)
البته بهجز این چهار مورد، یک مورد دیگر هم وجود دارد که به آن Mutable میگویند که این کلاس مختص زبان C++ است و در این سری از آموزشها از آن استفادهنخواهیمکرد.
کلاس حافظه اتوماتیک
این کلاس که پرکاربردترین کلاس حافظه هست با کلمه کلیدی auto مشخص میشود . اگر نوع کلاس حافظه متغیری را ذکر نکنیم، کامپایلر کلاس حافظه auto درنظرمیگیرد .این نوع متغیرها دارای خواصزیر هستند: بهصورت محلی(Local) هستند. یعنی در داخل بلاکی که تعریفشدهاند، قابل دسترسیاند. هنگام ورود یک متغیر به یک تابع یا بلاک، به آن حافظه اختصاص داده میشود و این حافظه هنگام خروج از تابع یا بلاک، پس گرفته میشود. چندینبار میتوانند مقدار اولیه بگیرند.
کلاس حافظه خارجی
اگر برنامههایی که مینویسیم، طولانی باشند، میتوانیم آنرا به قسمتهای کوچکتری تقسیمکنیم که به هر قسمت آن واحد(Unit) گفته میشود . اگر بخواهیم متغیرهایی را که در واحد اصلی تعریف شدهاند را در واحدهای فرعی استفادهکنیم و دیگر آنها را دوباره در واحدهای فرعی تعریف نکنیم، میتوانیم متغیرهای موردنظر را بااستفادهاز کلاس حافظه خارجی تعریفکنیم. بدینمنظور باید این متغیرها در واحد اصلی بهصورتعمومی تعریفشدهباشند و در واحد فرعی از کلمه کلیدی extern قبلاز تعریف این متغیرها استفادهکنیم. دقتکنید واحد اصلی و فرعی را بهصورت ساخت یک کتابخانه درنظر بگیرید که برای استفادهاز متغیرهای کتابخانه اصلی باید از دستور extern استفادهکنیم. طول عمر متغیرهایی که از کلاس حافظه extern هستند، از هنگام شروع برنامه تا پایان برنامه هستند و همچنین این متغیرها در سراسر برنامه قابلدسترس هستند.
کلاس حافظه استاتیک
این کلاس را میتوانیم به ۲قسمت کلی تقسیمکنیم:
- متغیرهای محلی کلاس حافظه استاتیک
- متغیرهای عمومی کلاس حافظه استاتیک
متغیرهای استاتیک محلی دارای خواص زیر هستند:
- فقط در همان تابعی که تعریفشدهاند، قابلدسترسیاند
- میتوانند مقدار اولیه بگیرند و فقط یکبار ارزشدهی اولیه را قبول میکنند
- درهنگام خروج از تابع، مقادیر متغیرها، آخرین مقداری خواهد بود که در تابع به آنها اختصاصیافتهاست و هنگام اجرای دوباره تابع، مقدار اولیه نمیگیرند
- متغیرهای استاتیک عمومی فقط در یک واحد از برنامه، ازجاییکه تعریف میشوند، به بعد قابلدسترسیاند.
کلاس حافظه ثبات
متغیرهای کلاس حافظه ثبات(register) درصورت امکان در یکیاز ثباتهای CPU قرار میگیرند؛ لذا سرعت انجام عملیات با آنها بسیاربالا است و درنتیجه موجب افزایش سرعت اجرای برنامه میشود. ولی این کلاس دارای محدودیتهای زیر است: متغیر از نوع ثبات درصورت امکان در یکیاز ثباتهای CPU قرار میگیرد زیرا بهدلیل کمبودن تعداد ثباتهای CPU، تعداد محدودی متغیر میتوانند در ثباتها قرار بگیرند. پس اگر تعداد متغیرهایی که از نوع کلاس حافظه ثبات تعریف شدهاند زیاد باشند، کامپایلر کلاس حافظه ثبات را از متغیرها حذف میکند(خیلی این نکته مهمه) کلمه کلیدی register تنها میتواند برای متغیرهای محلی و همچنین پارامترهای تابع بهکار گرفته شود. انواع متغیری که میتوانند دارای کلاس حافظه ثبات باشند، بسته به نوع ساختار متفاوت است. دلیل این امر هم این است که متغیرهای مختلف، تعداد بایت متفاوتی را به خود اختصاص میدهند. آدرس در مفهوم کلاس حافظه ثبات بیمعنی است زیرا متغیرها در ثباتهای CPU قرار میگیرند و نه در RAM. پس درمورد آن کلاس حافظه، نمیتوان از عملگر & برای اشاره به آدرس متغیرها استفادهکرد. نوع کلاس حافظه در زبان برنامهنویسی C بااستفادهاز کلمات کلیدی auto(برای کلاس حافظه اتوماتیک)، static(برای کلاس حافظه استاتیک)، register(برای کلاس حافظه ثبات ) و extern(برای کلاس حافظه خارجی) تعیین میگردد. نحوه تعریف اصولی تعریف متغیر در زبان C برای تعریف یک متغیر بهصورت اصولی در زبان C باید و حتما بهصورتزیر عملکنیم:
<اسامی متغیر> <نوع متغیر> <کلاس حافظه> ;
بهطورمثال میتوانیم برای تعریف متغیرها در میکروبلیز بهصورتزیر عملکنیم:
const float PI = 3.14; register unsigned char data; و ...
امیدوارم که این آموزش هم موردپسند شما مخاطبین عزیز قرارگرفتهباشد.
منبع:سیسوگ