بسماللهالرحمنالرحیم
اگر قسمت دوم آموزش میکروبلیز قسمت دوم: آموزش زبان برنامهنویسی C را مطالعه کرده باشید به مسائلی همچون اصول اولیه و قواعد کلی برنامهنویسی زبان C اشاره کردیم که توصیه میکنیم قبل از خواندن این قسمت حتما قسمت قبل را مطالعه کنید چون حتی اگر یک برنامهنویس حرفهای هم باشید حداقل میتواند به عنوان یادآوری برای شما خالی از لطف نباشد. همانطوری که گفته بودیم تا چند قسمت آینده به زبان C خواهیم پرداخت و پس از آن وارد مبحث میکروبلیز خواهیم شد (مطمئنا برای خیلی از دوستان که به زبان C مسلط هستند این قسمتها کسل کنندهاست اما ما تلاش میکنیم مقالات را به گونهای بنویسیم که اگر فردی هم هیچ اطلاعاتی در این زمینه نداشت نیاز نباشد که منابع دیگری را مطالعه کند بلکه با خواندن همین سری از مقالات به یک درک و یک تسلط نسبی در این زمینه برسد).
در این مقاله میخواهیم به تعریف اصولی متغیر در زبان برنامهنویسی C بپردازیم. این مبحث به قدری اهمیت دارد که تصمیم گرفتیم یک مقاله صرفا برای تعریف اصولی متغیر در نظر بگیریم.
متغیر چیست؟
اگر به صورت علمی بخواهیم متغیر را تعریف کنیم درواقع میتوان در یک جمله گفت، دادههایی که دارای مقادیر متفاوتی هستند را متغیر میگویند. حالا اگر متن را با دقت خوانده باشید اولین سوالی که برای شما پیش خواهد آمد این است که “داده چیست؟” در واقع دادها چیزی جز همان اعداد نیستند که بارها و بارها از آنها در شرایط مختلف استفاده کردیم به طور مثال حرفهای روزمره ما هر کدامشان یک عدد هستند و زمانیکه این اعداد کنار یکدیگر قرار میگیرند یک معنی خاص پیدا میکنند.
به طور مثال اعدادی که کلمه BLOOM را تشکیل دادهاند به صورت زیر میباشند.
1 2 3 4 5 | B 42 L 4C O 4F O 4F M 4D |
خیلی جالب است که بدانیم میکروکنترلرها هم دقیقا همینکار را انجام میدهند البته برای برقراری ارتباط با میکروکنترلرها باید داده هایی را که تعریف میکنیم از قواعد خاصی پیروی کنند. اگر دقیقتر در مورد داده صحبت کنیم به توضیح اعداد میرسیم، پس نیاز است که بدانیم چه قانونهایی برای اعداد در میکروکنترلرها باید رعایت کنیم.
یک عدد در زبان C دارای سه ویژگی زیر است:
علامت: میتواند بسته به نوع کاربرد مثبت یا منفی باشد.
نوع: میتواند بسته به نوع کاربرد صحیح یا اعشاری و … باشد.
اندازه: میتواند بسته به نیاز، مقادیر کم و یا زیاد را درون خود جای دهد و به همین دلیل حتما باید اندازه آن مشخص شده باشد.
استفاده از متغیر ها به صورت اصولی در برنامهنویسی C
زمانی میتوان گفت که یک متغییر به صورت اصولی در برنامه تعریف شده است که دارای شرایط زیر باشد.
خوانا بودن اسم متغیر
دقت کردن به نوع متغیر
دقت کردن به اندازه متغیر
دقت کردن به علامت متغیر
الگوریتم حل مسئله
در صورت سوال گفته شده است که یک سنسور دما و رطوبت داریم پس اولین جرقهای که در ذهن ما به وجود خواهد آمد این است که این یک سنسور دما، خروجی آن غالبا به صورت اعشاری است پس نکته اول اینجا است که باید متغییر یا از نوع Float یا Double انتخاب شود خب تا اینجا خیلی از گزینه ها حذف شدند حال نوبت به این میرسد که آیا نوع آن Float باشد یا Double ؟
اگر به سایز این دو در جدول نگاه کنیم به این نتیجه خواهیم رسید که 4 بایت برای ذخیره اطلاعات سنسور کافی است پس نهایتا نوع Float را انتخاب میکنیم.
1 | float temperature; |
دقت کنید انتخاب صحیح یک متغیر (نوع،اندازه و علامت ) به قدری مهم است که میتواند محصول شما را با شکست مواجه کند( لطفا خیلی به این موضوع دقت کنید).
تعریف متغیر به صورت اصولی در برنامهنویسی 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 باید و حتما به صورت زیر عمل کنیم.
1 | <اسامی متغیر> <نوع متغیر> <کلاس حافظه> ; |
به طور مثال میتوانیم برای تعریف متغیرها در میکروبلیز به صورت زیر عمل کنیم.
1 2 3 4 5 | const float PI = 3.14; register unsigned char data; و ... |
امیدوارم که این آموزش هم مورد پسند شما مخاطبین سیسوگی عزیز قرار گرفته باشد.
ممنون از این مقاله کاربردی
سلام دوست عزیز، ممنون که مارو دنبال میکنین.