اگر قسمت دوم آموزش میکروبلیز قسمت دوم: آموزش زبان برنامهنویسی Cرا مطالعه کرده باشید به مسائلی همچون اصول اولیه و قواعد کلی برنامهنویسی زبان C اشاره کردیم که توصیه میکنیم قبل از خواندن این قسمت حتما قسمت قبل را مطالعه کنید چون حتی اگر یک برنامهنویس حرفهای هم باشید حداقل میتواند به عنوان یادآوری برای شما خالی از لطف نباشد. همانطوری که گفته بودیم تا چند قسمت آینده به زبان C خواهیم پرداخت و پس از آن وارد مبحث میکروبلیز خواهیم شد (مطمئنا برای خیلی از دوستان که به زبان C مسلط هستند این قسمتها کسل کنندهاست اما ما تلاش میکنیم مقالات را به گونهای بنویسیم که اگر فردی هم هیچ اطلاعاتی در این زمینه نداشت نیاز نباشد که منابع دیگری را مطالعه کند بلکه با خواندن همین سری از مقالات به یک درک و یک تسلط نسبی در این زمینه برسد).
در این مقاله میخواهیم به تعریف اصولی متغیر در زبان برنامهنویسی C بپردازیم. این مبحث به قدری اهمیت دارد که تصمیم گرفتیم یک مقاله صرفا برای تعریف اصولی متغیر در نظر بگیریم.
متغیر چیست؟
اگر به صورت علمی بخواهیم متغیر را تعریف کنیم درواقع میتوان در یک جمله گفت، دادههایی که دارای مقادیر متفاوتی هستند را متغیر میگویند. حالا اگر متن را با دقت خوانده باشید اولین سوالی که برای شما پیش خواهد آمد این است که “داده چیست؟” در واقع دادها چیزی جز همان اعداد نیستند که بارها و بارها از آنها در شرایط مختلف استفاده کردیم به طور مثال حرفهای روزمره ما هر کدامشان یک عدد هستند و زمانیکه این اعداد کنار یکدیگر قرار میگیرند یک معنی خاص پیدا میکنند.
به طور مثال اعدادی که کلمه BLOOM را تشکیل دادهاند به صورت زیر میباشند.
C
1
2
3
4
5
B42
L4C
O4F
O4F
M4D
خیلی جالب است که بدانیم میکروکنترلرها هم دقیقا همینکار را انجام میدهند البته برای برقراری ارتباط با میکروکنترلرها باید داده هایی را که تعریف میکنیم از قواعد خاصی پیروی کنند. اگر دقیقتر در مورد داده صحبت کنیم به توضیح اعداد میرسیم، پس نیاز است که بدانیم چه قانونهایی برای اعداد در میکروکنترلرها باید رعایت کنیم.
یک عدد در زبان C دارای سه ویژگی زیر است:
علامت: میتواند بسته به نوع کاربرد مثبت یا منفی باشد.
نوع: میتواند بسته به نوع کاربرد صحیح یا اعشاری و … باشد.
اندازه: میتواند بسته به نیاز، مقادیر کم و یا زیاد را درون خود جای دهد و به همین دلیل حتما باید اندازه آن مشخص شده باشد.
استفاده از متغیر ها به صورت اصولی در برنامهنویسی C
زمانی میتوان گفت که یک متغییر به صورت اصولی در برنامه تعریف شده است که دارای شرایط زیر باشد.
خوانا بودن اسم متغیر
دقت کردن به نوع متغیر
دقت کردن به اندازه متغیر
دقت کردن به علامت متغیر
اجازه دهید با یک مثال به اهمیت موضوع بپردازیم. فرض کنید به شما گفته شده متغیری برای دریافت دیتا از یک سنسور (به طور مثال سنسور دما و رطوبت DHT22) تعریف کنید. راهحل چیست؟ دقت کنید که اگر در اینجا با اندازه متغیرها آشنا نباشید به مشکل برخورد خواهید کرد. برای حل این مسئله ابتدا با یک دیگر جدولی را که در ادامه قرار میدهیم را مرور میکنیم.(لطفا تک تک مقادیر جدول را مورد برسی قرار دهید برای این کار هم کافیاست نوع موردنظر را انتخاب کنید و در نهایت سرچ کنید.)
الگوریتم حل مسئله
در صورت سوال گفته شده است که یک سنسور دما و رطوبت داریم پس اولین جرقهای که در ذهن ما به وجود خواهد آمد این است که این یک سنسور دما، خروجی آن غالبا به صورت اعشاری است پس نکته اول اینجا است که باید متغییر یا از نوع Float یا Double انتخاب شود خب تا اینجا خیلی از گزینه ها حذف شدند حال نوبت به این میرسد که آیا نوع آن Float باشد یا Double ؟
اگر به سایز این دو در جدول نگاه کنیم به این نتیجه خواهیم رسید که 4 بایت برای ذخیره اطلاعات سنسور کافی است پس نهایتا نوع Float را انتخاب میکنیم.
C
1
floattemperature;
توصیه سعی کنید که از راهحل بالا به عنوان یک اصل کلی در تعریف متغیرهایتان استفاده کنید و از خودتان سوالاتی بپرسید(به چه مقدار فضا نیاز دارم؟ آیا نیاز است که خروجی را حتما از نوع 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 باید و حتما به صورت زیر عمل کنیم.
C
1
<اسامیمتغیر><نوعمتغیر><کلاسحافظه>;
به طور مثال میتوانیم برای تعریف متغیرها در میکروبلیز به صورت زیر عمل کنیم.
C++
1
2
3
4
5
constfloatPI=3.14;
registerunsignedchardata;
و...
امیدوارم که این آموزش هم مورد پسند شما مخاطبین سیسوگی عزیز قرار گرفته باشد.
ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموتهای درب بازکن تا ریموتهای دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی میکنند و آنهم ارسال اطلاعات بهصورت بیسیم است....
امنیت همیشه و در همهی اعصار، مقولهی مهم و قابلتوجه ای بوده و همیشه نوع بشر به دنبال امنیت بیشتر، دست به ابداعات و اختراعات گوناگونی زده است. ریموت کنترل یکی از این اختراعات است. در این مقاله، به بررسی امنیت انواع ریموتهای کنترل خواهیم پرداخت....
[…] قسمت سوم آموزش میکروبلیز “ آموزش میکروبلیز قسمت سوم: آموزش زبان برنامهنویسی C ” را مطالعه کرده باشید به بحث جذاب متغیرها با […]