سلام!
در این مطلب قصد دارم نکته ها و کد های لازم و کاربردی در زبان سی و سی ++ رو قرار بدم! امیدوام به دردتون بخوره!
تبدیل نوع متغییر عددی
یه نکته جالب یاد گرفتم که حتما به دردتون میخوره!
اینو میدونید که انواع متغییر ها حجم خاص خودشون رو توی حافظه میگیرن!
حافظه میکرو هم که کمه! مثلا وقتی ما از متغییر int استفاده کنیم حجم کمتری نسبت به float میگیره! بنابراین ما میایم و از int استفاده میکنیم!
اما بعضی وقتا میشه که بخوایم عدد صحیح رو تقسیم کنیم! که در اینصورت ممکنه اعداد حقیقی (اعشاری) بوجود بیاد!
مثلا 7/2 برابر است با 3.5 اما اگه متغییر ما از نوع int باشه فقط عدد 3 رو به ما نشون میده!
برای اینکار ما در لحظه ی تقسیم میایم و یه مدت لحظه ای نوع متغییر رو به float تغییر میدیم!
برای اینکار از کد زیر استفاده میکنیم!
static_cast <type> (variable)
در این کد static_cast ثابته و ما برای تبدیل باید اینو حتما بنویسیم!،
همچنین type نوع متغییرمون مه میخوایم به اون تبدیل بشه هست! مثلا میخوایم int رو به float تبدیل کنیم باید بنویسیم float
و در آخر variable هم اسم متغییرمون هست که میخوایم تبدیل بشه!
به تکه کد زیر که از C++ هست دقت کنید!
int a;
int b ;
float c ;
c = static_cast <float> (a) / b ;
بد در این مثال! int a که عددی صحیح هست بر int b که عددی صحیح هست تقسیم میشه و عدد اعشاری در float c که عدد اعشاریه ذخیره میشه!
محدود کردن قسمت اعشار اعداد اعشاری
خوب برای اینکار میشه از کد زیر استفاده کرد!
البته توجه کنید که قبلش باید کتابخونه زیر رو بهش اضافه کنید
#include <iomanip>
کدش به شکل زیره!
setprecision(value)
که به جای عبارت Value عدد قرار میگیره! مثلا اگه عدد دو قرار بگیره تا دو رقم اعشار رو نشون میده!
و اگه عبارت زیر رو هم توی کدتون قرار بدید همیشه اعداد رو به صورت اعشاری نشون میده! مثلا عدد 2 رو به صورت 2.00 نشون میده!
fixed
برای استفاده از کد ها باید توی کدی که میخواد عدد رو نمایش بده قرار بدین! البته توجه داشته باشین که باید عددی که میخواید به صورت اعشاری نشون بده حتما باید float یا double باشه! مثل زیر
float d= 43;
cout << fixed << setprecision(2) << d << endl ;
در کد بالا خروجی ما میشه 43.00 واگه عدد 2 توی پرانتز خط دوم رو تغییر بدیم رقم های اعشار تغییر میکنه
* آدرس دهی به حافظه
خوب این چیز خیلی جالبیه!
شما اگه به دیتا شیت میکروکنترلر ها نگاهی بینادازید میبینید که یه نقشه حافظه دارند!
نمونه زیر نقشه حافظه ی میکروکنترلر lpc 1768 هست! اگه دقت کنید gpio در آدرس 0x2009 C000 در حافظه هست!
یعنی تنظیمات GPIO توی این قسمت از حافظه هست! بنابراین شما با در اختیار داشتن این آدرس ها میتوانید خودتون مقدار GPIO رو تغییر بدید!
حالا سوال اینجاست که چطوری میتونیم توی اون قسمت از حافظه بنویسیم!
جواب اینه که با اشاره گر! و با استفاده از DEFINE میتونیم اینکار رو بکنیم!
مثلا تکه کد زیر همان کار LPC_GPIO2->FIOPIN=0XAA رو انجام میده
#define ioset *((volatile unsigned long*)((0x2009C000UL + 0x00040) | 0x2009C014))
ioset = 0xAA;
آدرس 0x2009C000UL همون آدرس شروع GPIO در حافظه هست
اون 0X40 هم در واقع فاصله ی GPIO2 از نقطه ی اول حافظه ی GPIO هست که با اون آدرس بالایی جمع میشه تا آدرس GPIO2 بدست بیاد
آدرس 0x2009C014 هم همون مکان FIOPIN هست که با آدرس GPIO2 یا (OR) میشه!
کد زیر هم همون کار کد بالا رو انجام میده فقط کارهای ریاضی روش انجام شده!
#define ioset *((volatile unsigned long*)(0x2009C054UL))